mirror of
https://github.com/Ellpeck/PrettyPipes.git
synced 2024-11-22 19:58:35 +01:00
added pipe wrench
This commit is contained in:
parent
44595ab0a8
commit
46ef0ef0a9
8 changed files with 143 additions and 30 deletions
|
@ -83,20 +83,13 @@ sourceSets.main.resources {
|
||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
|
||||||
maven {
|
maven {
|
||||||
url = "https://dvs1.progwml6.com/files/maven"
|
url = "https://dvs1.progwml6.com/files/maven"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
configurations {
|
|
||||||
embed
|
|
||||||
compile.extendsFrom(embed)
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
minecraft 'net.minecraftforge:forge:1.15.2-31.1.19'
|
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")
|
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")
|
runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.2")
|
||||||
|
@ -115,7 +108,6 @@ jar {
|
||||||
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
|
"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) {
|
task deobfJar(type: Jar) {
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
package de.ellpeck.prettypipes;
|
package de.ellpeck.prettypipes;
|
||||||
|
|
||||||
import de.ellpeck.prettypipes.blocks.PipeBlock;
|
import de.ellpeck.prettypipes.blocks.PipeBlock;
|
||||||
|
import de.ellpeck.prettypipes.items.WrenchItem;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.client.renderer.RenderType;
|
import net.minecraft.client.renderer.RenderType;
|
||||||
import net.minecraft.client.renderer.RenderTypeLookup;
|
import net.minecraft.client.renderer.RenderTypeLookup;
|
||||||
import net.minecraft.item.BlockItem;
|
import net.minecraft.item.BlockItem;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemGroup;
|
import net.minecraft.item.ItemGroup;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraftforge.event.RegistryEvent;
|
import net.minecraftforge.event.RegistryEvent;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
import net.minecraftforge.fml.common.Mod;
|
||||||
|
@ -18,6 +20,14 @@ import net.minecraftforge.registries.ForgeRegistries;
|
||||||
@Mod.EventBusSubscriber(bus = Bus.MOD)
|
@Mod.EventBusSubscriber(bus = Bus.MOD)
|
||||||
public final class Registry {
|
public final class Registry {
|
||||||
|
|
||||||
|
public static final ItemGroup GROUP = new ItemGroup(PrettyPipes.ID) {
|
||||||
|
@Override
|
||||||
|
public ItemStack createIcon() {
|
||||||
|
return new ItemStack(wrench);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public static Item wrench;
|
||||||
public static Block pipe;
|
public static Block pipe;
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
|
@ -29,9 +39,13 @@ public final class Registry {
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public static void registerItems(RegistryEvent.Register<Item> event) {
|
public static void registerItems(RegistryEvent.Register<Item> event) {
|
||||||
|
event.getRegistry().registerAll(
|
||||||
|
wrench = new WrenchItem().setRegistryName("wrench")
|
||||||
|
);
|
||||||
|
|
||||||
ForgeRegistries.BLOCKS.getValues().stream()
|
ForgeRegistries.BLOCKS.getValues().stream()
|
||||||
.filter(b -> b.getRegistryName().getNamespace().equals(PrettyPipes.ID))
|
.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())));
|
.forEach(b -> event.getRegistry().register(new BlockItem(b, new Item.Properties().group(GROUP)).setRegistryName(b.getRegistryName())));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setup(FMLCommonSetupEvent event) {
|
public static void setup(FMLCommonSetupEvent event) {
|
||||||
|
|
|
@ -12,6 +12,7 @@ import net.minecraft.state.EnumProperty;
|
||||||
import net.minecraft.state.StateContainer;
|
import net.minecraft.state.StateContainer;
|
||||||
import net.minecraft.util.Direction;
|
import net.minecraft.util.Direction;
|
||||||
import net.minecraft.util.IStringSerializable;
|
import net.minecraft.util.IStringSerializable;
|
||||||
|
import net.minecraft.util.datafix.fixes.BlockEntityKeepPacked;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.shapes.ISelectionContext;
|
import net.minecraft.util.math.shapes.ISelectionContext;
|
||||||
import net.minecraft.util.math.shapes.VoxelShape;
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
|
@ -29,7 +30,7 @@ public class PipeBlock extends Block {
|
||||||
public static final Map<Direction, EnumProperty<ConnectionType>> DIRECTIONS = new HashMap<>();
|
public static final Map<Direction, EnumProperty<ConnectionType>> DIRECTIONS = new HashMap<>();
|
||||||
private static final Map<BlockState, VoxelShape> SHAPE_CACHE = 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 VoxelShape CENTER_SHAPE = makeCuboidShape(5, 5, 5, 11, 11, 11);
|
||||||
private static final Map<Direction, VoxelShape> DIR_SHAPES = ImmutableMap.<Direction, VoxelShape>builder()
|
public static final Map<Direction, VoxelShape> DIR_SHAPES = ImmutableMap.<Direction, VoxelShape>builder()
|
||||||
.put(Direction.UP, makeCuboidShape(5, 10, 5, 11, 16, 11))
|
.put(Direction.UP, makeCuboidShape(5, 10, 5, 11, 16, 11))
|
||||||
.put(Direction.DOWN, makeCuboidShape(5, 0, 5, 11, 6, 11))
|
.put(Direction.DOWN, makeCuboidShape(5, 0, 5, 11, 6, 11))
|
||||||
.put(Direction.NORTH, makeCuboidShape(5, 5, 0, 11, 11, 6))
|
.put(Direction.NORTH, makeCuboidShape(5, 5, 0, 11, 11, 6))
|
||||||
|
@ -59,7 +60,7 @@ public class PipeBlock extends Block {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) {
|
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) {
|
||||||
BlockState newState = this.createState(worldIn, pos);
|
BlockState newState = this.createState(worldIn, pos, state);
|
||||||
if (newState != state)
|
if (newState != state)
|
||||||
worldIn.setBlockState(pos, newState);
|
worldIn.setBlockState(pos, newState);
|
||||||
}
|
}
|
||||||
|
@ -67,24 +68,7 @@ public class PipeBlock extends Block {
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
public BlockState getStateForPlacement(BlockItemUseContext context) {
|
||||||
return this.createState(context.getWorld(), context.getPos());
|
return this.createState(context.getWorld(), context.getPos(), this.getDefaultState());
|
||||||
}
|
|
||||||
|
|
||||||
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
|
@Override
|
||||||
|
@ -107,9 +91,33 @@ public class PipeBlock extends Block {
|
||||||
return shape;
|
return shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BlockState createState(World world, BlockPos pos, BlockState current) {
|
||||||
|
BlockState state = this.getDefaultState();
|
||||||
|
for (Map.Entry<Direction, EnumProperty<ConnectionType>> entry : DIRECTIONS.entrySet()) {
|
||||||
|
ConnectionType type = getConnectionType(world, pos, entry.getKey());
|
||||||
|
if (type == ConnectionType.CONNECTED && current.get(entry.getValue()) == ConnectionType.BLOCKED)
|
||||||
|
type = ConnectionType.BLOCKED;
|
||||||
|
state = state.with(entry.getValue(), type);
|
||||||
|
}
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ConnectionType getConnectionType(World world, BlockPos pos, Direction direction) {
|
||||||
|
BlockPos offset = pos.offset(direction);
|
||||||
|
if (!world.isBlockLoaded(offset))
|
||||||
|
return ConnectionType.DISCONNECTED;
|
||||||
|
BlockState state = world.getBlockState(offset);
|
||||||
|
if (!(state.getBlock() instanceof PipeBlock))
|
||||||
|
return ConnectionType.DISCONNECTED;
|
||||||
|
if (state.get(DIRECTIONS.get(direction.getOpposite())) == ConnectionType.BLOCKED)
|
||||||
|
return ConnectionType.BLOCKED;
|
||||||
|
return ConnectionType.CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
public enum ConnectionType implements IStringSerializable {
|
public enum ConnectionType implements IStringSerializable {
|
||||||
CONNECTED,
|
CONNECTED,
|
||||||
DISCONNECTED;
|
DISCONNECTED,
|
||||||
|
BLOCKED;
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
|
|
69
src/main/java/de/ellpeck/prettypipes/items/WrenchItem.java
Normal file
69
src/main/java/de/ellpeck/prettypipes/items/WrenchItem.java
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
package de.ellpeck.prettypipes.items;
|
||||||
|
|
||||||
|
import de.ellpeck.prettypipes.Registry;
|
||||||
|
import de.ellpeck.prettypipes.blocks.PipeBlock;
|
||||||
|
import de.ellpeck.prettypipes.blocks.PipeBlock.ConnectionType;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
import net.minecraft.item.ItemUseContext;
|
||||||
|
import net.minecraft.state.EnumProperty;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.ActionResultType;
|
||||||
|
import net.minecraft.util.Direction;
|
||||||
|
import net.minecraft.util.SoundCategory;
|
||||||
|
import net.minecraft.util.SoundEvents;
|
||||||
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.shapes.VoxelShape;
|
||||||
|
import net.minecraft.util.math.shapes.VoxelShapes;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class WrenchItem extends Item {
|
||||||
|
public WrenchItem() {
|
||||||
|
super(new Item.Properties().maxStackSize(1).group(Registry.GROUP));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionResultType onItemUse(ItemUseContext context) {
|
||||||
|
World world = context.getWorld();
|
||||||
|
BlockPos pos = context.getPos();
|
||||||
|
BlockState state = world.getBlockState(pos);
|
||||||
|
if (!(state.getBlock() instanceof PipeBlock))
|
||||||
|
return ActionResultType.PASS;
|
||||||
|
|
||||||
|
if (context.getPlayer().isShiftKeyDown()) {
|
||||||
|
if (!world.isRemote) {
|
||||||
|
Block.spawnDrops(state, world, pos, world.getTileEntity(pos), null, ItemStack.EMPTY);
|
||||||
|
world.playSound(null, pos, SoundEvents.ENTITY_ITEM_FRAME_REMOVE_ITEM, SoundCategory.PLAYERS, 1, 1);
|
||||||
|
world.removeBlock(pos, false);
|
||||||
|
}
|
||||||
|
return ActionResultType.SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Blocking
|
||||||
|
for (Map.Entry<Direction, VoxelShape> entry : PipeBlock.DIR_SHAPES.entrySet()) {
|
||||||
|
AxisAlignedBB box = entry.getValue().getBoundingBox().offset(pos).grow(0.001F);
|
||||||
|
if (!box.contains(context.getHitVec()))
|
||||||
|
continue;
|
||||||
|
EnumProperty<ConnectionType> prop = PipeBlock.DIRECTIONS.get(entry.getKey());
|
||||||
|
ConnectionType curr = state.get(prop);
|
||||||
|
if (curr == ConnectionType.DISCONNECTED)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!world.isRemote) {
|
||||||
|
ConnectionType newType = curr == ConnectionType.BLOCKED ? ConnectionType.CONNECTED : ConnectionType.BLOCKED;
|
||||||
|
BlockState newState = state.with(prop, newType);
|
||||||
|
world.setBlockState(pos, newState);
|
||||||
|
|
||||||
|
BlockPos otherPos = pos.offset(entry.getKey());
|
||||||
|
world.setBlockState(otherPos, world.getBlockState(otherPos).with(PipeBlock.DIRECTIONS.get(entry.getKey().getOpposite()), newType));
|
||||||
|
}
|
||||||
|
return ActionResultType.SUCCESS;
|
||||||
|
}
|
||||||
|
return ActionResultType.PASS;
|
||||||
|
}
|
||||||
|
}
|
5
src/main/resources/assets/prettypipes/lang/en_us.json
Normal file
5
src/main/resources/assets/prettypipes/lang/en_us.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"item.prettypipes.wrench": "Pipe Wrench",
|
||||||
|
"block.prettypipes.pipe": "Pipe",
|
||||||
|
"itemGroup.prettypipes": "Pretty Pipes"
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"parent": "item/handheld",
|
||||||
|
"textures": {
|
||||||
|
"layer0": "prettypipes:item/wrench"
|
||||||
|
}
|
||||||
|
}
|
BIN
src/main/resources/assets/prettypipes/textures/item/wrench.png
Normal file
BIN
src/main/resources/assets/prettypipes/textures/item/wrench.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 284 B |
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"type": "minecraft:block",
|
||||||
|
"pools": [
|
||||||
|
{
|
||||||
|
"rolls": 1,
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item",
|
||||||
|
"name": "prettypipes:pipe"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"condition": "minecraft:survives_explosion"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
Loading…
Reference in a new issue