basic pipe looks

This commit is contained in:
Ellpeck 2020-04-13 21:48:35 +02:00
parent 06c965b9a0
commit 44595ab0a8
18 changed files with 964 additions and 0 deletions

22
.gitignore vendored Normal file
View file

@ -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

23
Jenkinsfile vendored Normal file
View file

@ -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'
}
}
}
}

153
build.gradle Normal file
View file

@ -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")
}
}
}

4
gradle.properties Normal file
View file

@ -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

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View file

@ -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

172
gradlew vendored Normal file
View file

@ -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" "$@"

84
gradlew.bat vendored Normal file
View file

@ -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

View file

@ -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);
}
}

View file

@ -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<Block> event) {
event.getRegistry().registerAll(
pipe = new PipeBlock().setRegistryName("pipe")
);
}
@SubscribeEvent
public static void registerItems(RegistryEvent.Register<Item> 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());
}
}

View file

@ -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<Direction, EnumProperty<ConnectionType>> DIRECTIONS = new HashMap<>();
private static final Map<BlockState, VoxelShape> SHAPE_CACHE = new HashMap<>();
private static final VoxelShape CENTER_SHAPE = makeCuboidShape(5, 5, 5, 11, 11, 11);
private static final Map<Direction, VoxelShape> DIR_SHAPES = ImmutableMap.<Direction, VoxelShape>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<ConnectionType> prop : DIRECTIONS.values())
state = state.with(prop, ConnectionType.DISCONNECTED);
this.setDefaultState(state);
}
@Override
protected void fillStateContainer(StateContainer.Builder<Block, BlockState> 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<Direction, EnumProperty<ConnectionType>> 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<Direction, EnumProperty<ConnectionType>> 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;
}
}
}

View file

@ -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 <here>
#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'''

View file

@ -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
}
}
]
}

View file

@ -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"}
}
}
]
}

View file

@ -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"}
}
}
]
}

View file

@ -0,0 +1,3 @@
{
"parent": "prettypipes:block/pipe_center"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 B

View file

@ -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."
}
}