diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96a7fcf --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +/rebuild.bat +/doAllTheThings.bat +/.gradle +/build +/out +/idea +/.idea +/*.iml +/*.ipr +/*.iws +/lib +/classes +/bin/ +/run/ + +*.classpath +*.project +.settings/org.eclipse.buildship.core.prefs +*.launch +.settings/org.eclipse.jdt.core.prefs +*.prefs +.cache \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..385af89 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,23 @@ +pipeline { + agent any + stages { + stage('Clean') { + steps { + sh 'chmod +x ./gradlew' + sh './gradlew clean --no-daemon' + } + } + + stage('Build') { + steps { + sh './gradlew build --no-daemon' + } + } + + stage('Upload Artifacts') { + steps { + archiveArtifacts 'build/libs/**.jar' + } + } + } +} diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..50e474b --- /dev/null +++ b/build.gradle @@ -0,0 +1,153 @@ +buildscript { + repositories { + maven { url = 'https://files.minecraftforge.net/maven' } + jcenter() + mavenCentral() + } + dependencies { + classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true + } +} +apply plugin: 'net.minecraftforge.gradle' +// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. +apply plugin: 'eclipse' +apply plugin: 'maven-publish' + +version = '0.1' +group = 'de.ellpeck.prettypipes' // http://maven.apache.org/guides/mini/guide-naming-conventions.html +archivesBaseName = 'PrettyPipes' + +if (System.getenv('BUILD_NUMBER') != null) { + version += "." + System.getenv('BUILD_NUMBER') +} +sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. + +minecraft { + mappings channel: 'snapshot', version: '20200128-1.15.1' + + runs { + client { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'info' + + mods { + prettypipes { + source sourceSets.main + } + } + } + + server { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'info' + + mods { + prettypipes { + source sourceSets.main + } + } + } + + data { + workingDirectory project.file('run') + + // Recommended logging data for a userdev environment + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + + // Recommended logging level for the console + property 'forge.logging.console.level', 'info' + + args '--mod', 'prettypipes', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/'), '--existing', file('src/generated/resources') + + mods { + prettypipes { + source sourceSets.main + } + } + } + } +} + +sourceSets.main.resources { + srcDir 'src/generated/resources' +} + +repositories { + mavenCentral() + maven { + url = "https://dvs1.progwml6.com/files/maven" + } +} + +configurations { + embed + compile.extendsFrom(embed) +} + +dependencies { + minecraft 'net.minecraftforge:forge:1.15.2-31.1.19' + embed "org.jgrapht:jgrapht-core:1.4.0" + + compileOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.2:api") + runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.2") +} + +// Example for how to get properties into the manifest for reading by the runtime.. +jar { + manifest { + attributes([ + "Specification-Title" : "prettypipes", + "Specification-Vendor" : "Ellpeck", + "Specification-Version" : "1", // We are version 1 of ourselves + "Implementation-Title" : project.name, + "Implementation-Version" : "${version}", + "Implementation-Vendor" : "Ellpeck", + "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") + ]) + } + from configurations.embed.collect { it.isDirectory() ? it : zipTree(it) } +} + +task deobfJar(type: Jar) { + from(sourceSets.main.output) + archiveName = "${baseName}-${version}-deobf.${extension}" +} +artifacts { + archives deobfJar +} + +publishing { + publications { + mavenJava(MavenPublication) { + groupId project.group + artifactId project.archivesBaseName + version project.version + from components.java + + artifact deobfJar { + classifier 'deobf' + } + + pom.withXml { + def node = asNode() + if (node.dependencies.size() > 0) + node.remove(node.dependencies) + } + } + } + repositories { + maven { + url "file://" + System.getenv("local_maven") + } + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..878bf1f --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +# Sets default memory used for gradle commands. Can be overridden by user or command line properties. +# This is required to provide enough memory for the Minecraft decompilation process. +org.gradle.jvmargs=-Xmx3G +org.gradle.daemon=false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..7a3265e Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e2091ca --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Oct 20 21:47:13 CEST 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# 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" -a "$nonstop" = "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"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + 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 + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@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 + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +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 Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_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=%* + +: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/de/ellpeck/prettypipes/PrettyPipes.java b/src/main/java/de/ellpeck/prettypipes/PrettyPipes.java new file mode 100644 index 0000000..aba3e72 --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/PrettyPipes.java @@ -0,0 +1,17 @@ +package de.ellpeck.prettypipes; + +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; + +@Mod(PrettyPipes.ID) +public final class PrettyPipes { + + public static final String ID = "prettypipes"; + + public PrettyPipes() { + IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); + bus.addListener(Registry::setup); + bus.addListener(Registry::setupClient); + } +} diff --git a/src/main/java/de/ellpeck/prettypipes/Registry.java b/src/main/java/de/ellpeck/prettypipes/Registry.java new file mode 100644 index 0000000..b2a127f --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/Registry.java @@ -0,0 +1,44 @@ +package de.ellpeck.prettypipes; + +import de.ellpeck.prettypipes.blocks.PipeBlock; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.item.BlockItem; +import net.minecraft.item.Item; +import net.minecraft.item.ItemGroup; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.registries.ForgeRegistries; + +@Mod.EventBusSubscriber(bus = Bus.MOD) +public final class Registry { + + public static Block pipe; + + @SubscribeEvent + public static void registerBlocks(RegistryEvent.Register event) { + event.getRegistry().registerAll( + pipe = new PipeBlock().setRegistryName("pipe") + ); + } + + @SubscribeEvent + public static void registerItems(RegistryEvent.Register event) { + ForgeRegistries.BLOCKS.getValues().stream() + .filter(b -> b.getRegistryName().getNamespace().equals(PrettyPipes.ID)) + .forEach(b -> event.getRegistry().register(new BlockItem(b, new Item.Properties().group(ItemGroup.MISC)).setRegistryName(b.getRegistryName()))); + } + + public static void setup(FMLCommonSetupEvent event) { + + } + + public static void setupClient(FMLClientSetupEvent event) { + RenderTypeLookup.setRenderLayer(pipe, RenderType.cutout()); + } +} diff --git a/src/main/java/de/ellpeck/prettypipes/blocks/PipeBlock.java b/src/main/java/de/ellpeck/prettypipes/blocks/PipeBlock.java new file mode 100644 index 0000000..24ae8f4 --- /dev/null +++ b/src/main/java/de/ellpeck/prettypipes/blocks/PipeBlock.java @@ -0,0 +1,125 @@ +package de.ellpeck.prettypipes.blocks; + +import com.google.common.collect.ImmutableMap; +import net.minecraft.block.Block; +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.block.SoundType; +import net.minecraft.block.material.Material; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.EnumProperty; +import net.minecraft.state.StateContainer; +import net.minecraft.util.Direction; +import net.minecraft.util.IStringSerializable; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public class PipeBlock extends Block { + + public static final Map> DIRECTIONS = new HashMap<>(); + private static final Map SHAPE_CACHE = new HashMap<>(); + private static final VoxelShape CENTER_SHAPE = makeCuboidShape(5, 5, 5, 11, 11, 11); + private static final Map DIR_SHAPES = ImmutableMap.builder() + .put(Direction.UP, makeCuboidShape(5, 10, 5, 11, 16, 11)) + .put(Direction.DOWN, makeCuboidShape(5, 0, 5, 11, 6, 11)) + .put(Direction.NORTH, makeCuboidShape(5, 5, 0, 11, 11, 6)) + .put(Direction.SOUTH, makeCuboidShape(5, 5, 10, 11, 11, 16)) + .put(Direction.EAST, makeCuboidShape(10, 5, 5, 16, 11, 11)) + .put(Direction.WEST, makeCuboidShape(0, 5, 5, 6, 11, 11)) + .build(); + + static { + for (Direction dir : Direction.values()) + DIRECTIONS.put(dir, EnumProperty.create(dir.getName(), ConnectionType.class)); + } + + public PipeBlock() { + super(Block.Properties.create(Material.ROCK).hardnessAndResistance(2).sound(SoundType.STONE).notSolid()); + + BlockState state = this.getDefaultState(); + for (EnumProperty prop : DIRECTIONS.values()) + state = state.with(prop, ConnectionType.DISCONNECTED); + this.setDefaultState(state); + } + + @Override + protected void fillStateContainer(StateContainer.Builder builder) { + builder.add(DIRECTIONS.values().toArray(new EnumProperty[0])); + } + + @Override + public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { + BlockState newState = this.createState(worldIn, pos); + if (newState != state) + worldIn.setBlockState(pos, newState); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + return this.createState(context.getWorld(), context.getPos()); + } + + private BlockState createState(World world, BlockPos pos) { + BlockState state = this.getDefaultState(); + for (Map.Entry> entry : DIRECTIONS.entrySet()) { + BlockPos neighborPos = pos.offset(entry.getKey()); + boolean canConnect = this.canConnect(world, neighborPos); + state = state.with(entry.getValue(), canConnect ? ConnectionType.CONNECTED : ConnectionType.DISCONNECTED); + } + return state; + } + + private boolean canConnect(World world, BlockPos offset) { + if (!world.isBlockLoaded(offset)) + return false; + BlockState state = world.getBlockState(offset); + return state.getBlock() == this; + } + + @Override + public boolean isNormalCube(BlockState state, IBlockReader worldIn, BlockPos pos) { + return false; + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) { + VoxelShape shape = SHAPE_CACHE.get(state); + if (shape != null) + return shape; + + shape = CENTER_SHAPE; + for (Map.Entry> entry : DIRECTIONS.entrySet()) { + if (state.get(entry.getValue()) == ConnectionType.CONNECTED) + shape = VoxelShapes.or(shape, DIR_SHAPES.get(entry.getKey())); + } + SHAPE_CACHE.put(state, shape); + return shape; + } + + public enum ConnectionType implements IStringSerializable { + CONNECTED, + DISCONNECTED; + + private final String name; + + ConnectionType() { + this.name = this.name().toLowerCase(Locale.ROOT); + } + + @Override + public String getName() { + return this.name; + } + } +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..213fac7 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,32 @@ +# This is an example mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml +# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml +modLoader="javafml" #mandatory +# A version range to match for said mod loader - for regular FML @Mod it will be the forge version +loaderVersion="[28,)" #mandatory (28 is current forge version) +# A URL to refer people to when problems occur with this mod +issueTrackerURL="https://github.com/Ellpeck/PrettyPipes" #optional +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory +# The modid of the mod +modId="prettypipes" #mandatory +# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it +version="${version}" #mandatory + # A display name for the mod +displayName="Pretty Pipes" #mandatory +# A URL to query for updates for this mod. See the JSON update specification +#updateJSONURL="http://myurl.me/" #optional +# A URL for the "homepage" for this mod, displayed in the mod UI +#displayURL="http://example.com/" #optional +# A file name (in the root of the mod JAR) containing a logo for display +#logoFile="examplemod.png" #optional +# A text field displayed in the mod UI +credits="Commission for Violet" #optional +# A text field displayed in the mod UI +authors="Ellpeck" #optional +# The description text for the mod (multi line!) (#mandatory) +description=''' +wow pipes, how creative''' \ No newline at end of file diff --git a/src/main/resources/assets/prettypipes/blockstates/pipe.json b/src/main/resources/assets/prettypipes/blockstates/pipe.json new file mode 100644 index 0000000..e0433a5 --- /dev/null +++ b/src/main/resources/assets/prettypipes/blockstates/pipe.json @@ -0,0 +1,62 @@ +{ + "multipart": [ + { + "apply": { + "model": "prettypipes:block/pipe_center" + } + }, + { + "when": { + "north": "connected" + }, + "apply": { + "model": "prettypipes:block/pipe_end" + } + }, + { + "when": { + "south": "connected" + }, + "apply": { + "model": "prettypipes:block/pipe_end", + "y": 180 + } + }, + { + "when": { + "east": "connected" + }, + "apply": { + "model": "prettypipes:block/pipe_end", + "y": 90 + } + }, + { + "when": { + "west": "connected" + }, + "apply": { + "model": "prettypipes:block/pipe_end", + "y": 270 + } + }, + { + "when": { + "down": "connected" + }, + "apply": { + "model": "prettypipes:block/pipe_end", + "x": 90 + } + }, + { + "when": { + "up": "connected" + }, + "apply": { + "model": "prettypipes:block/pipe_end", + "x": 270 + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/prettypipes/models/block/pipe_center.json b/src/main/resources/assets/prettypipes/models/block/pipe_center.json new file mode 100644 index 0000000..ea53f5b --- /dev/null +++ b/src/main/resources/assets/prettypipes/models/block/pipe_center.json @@ -0,0 +1,153 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "prettypipes:block/pipe", + "particle": "prettypipes:block/pipe" + }, + "elements": [ + { + "from": [5, 5, 5], + "to": [6, 11, 6], + "faces": { + "north": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#0"} + } + }, + { + "from": [5, 5, 10], + "to": [6, 11, 11], + "faces": { + "north": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#0"} + } + }, + { + "from": [10, 5, 10], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#0"} + } + }, + { + "from": [10, 5, 5], + "to": [11, 11, 6], + "faces": { + "north": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 6], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 1], "texture": "#0"} + } + }, + { + "from": [6, 10, 10], + "to": [10, 11, 11], + "faces": { + "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 1], "texture": "#0"} + } + }, + { + "from": [6, 5, 10], + "to": [10, 6, 11], + "faces": { + "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 1], "texture": "#0"} + } + }, + { + "from": [6, 5, 5], + "to": [10, 6, 6], + "faces": { + "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 1], "texture": "#0"} + } + }, + { + "from": [5, 5, 6], + "to": [6, 6, 10], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 4], "texture": "#0"} + } + }, + { + "from": [5, 10, 6], + "to": [6, 11, 10], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 4], "texture": "#0"} + } + }, + { + "from": [10, 10, 6], + "to": [11, 11, 10], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 4], "texture": "#0"} + } + }, + { + "from": [10, 5, 6], + "to": [11, 6, 10], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 1, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 1, 4], "texture": "#0"} + } + }, + { + "from": [6, 10, 5], + "to": [10, 11, 6], + "faces": { + "north": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 1], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 1], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/prettypipes/models/block/pipe_end.json b/src/main/resources/assets/prettypipes/models/block/pipe_end.json new file mode 100644 index 0000000..8eac2f0 --- /dev/null +++ b/src/main/resources/assets/prettypipes/models/block/pipe_end.json @@ -0,0 +1,57 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "prettypipes:block/pipe", + "particle": "prettypipes:block/pipe" + }, + "elements": [ + { + "from": [5, 10, 0], + "to": [6, 11, 5], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 5, 1], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 5, 1], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [5, 5, 0], + "to": [6, 6, 5], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 5, 1], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 5, 1], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [10, 5, 0], + "to": [11, 6, 5], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 5, 1], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 5, 1], "rotation": 270, "texture": "#0"} + } + }, + { + "from": [10, 10, 0], + "to": [11, 11, 5], + "faces": { + "north": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "east": {"uv": [0, 0, 5, 1], "texture": "#0"}, + "south": {"uv": [0, 0, 1, 1], "texture": "#0"}, + "west": {"uv": [0, 0, 5, 1], "texture": "#0"}, + "up": {"uv": [0, 0, 5, 1], "rotation": 90, "texture": "#0"}, + "down": {"uv": [0, 0, 5, 1], "rotation": 270, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/prettypipes/models/item/pipe.json b/src/main/resources/assets/prettypipes/models/item/pipe.json new file mode 100644 index 0000000..372742d --- /dev/null +++ b/src/main/resources/assets/prettypipes/models/item/pipe.json @@ -0,0 +1,3 @@ +{ + "parent": "prettypipes:block/pipe_center" +} \ No newline at end of file diff --git a/src/main/resources/assets/prettypipes/textures/block/pipe.png b/src/main/resources/assets/prettypipes/textures/block/pipe.png new file mode 100644 index 0000000..185ea6e Binary files /dev/null and b/src/main/resources/assets/prettypipes/textures/block/pipe.png differ diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..a0d2162 --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "Pretty Pipes", + "pack_format": 4, + "_comment": "A pack_format of 4 requires json lang files. Note: we require v4 pack meta for all mods." + } +} \ No newline at end of file