Merge branch 'mc1.14-v0.2.2'

This commit is contained in:
simibubi 2020-03-29 04:44:35 +02:00
commit 3371267e79
224 changed files with 5777 additions and 1266 deletions

View file

@ -13,7 +13,7 @@ apply plugin: 'net.minecraftforge.gradle'
apply plugin: 'eclipse'
apply plugin: 'maven-publish'
version = 'mc1.14.4_v0.2.1'
version = 'mc1.14.4_v0.2.2a'
group = 'com.simibubi.create'
archivesBaseName = 'create'
@ -26,6 +26,7 @@ minecraft {
client {
workingDirectory project.file('run')
property 'forge.logging.console.level', 'info'
property 'fml.earlyprogresswindow', 'false'
mods {
create {
source sourceSets.main
@ -45,8 +46,9 @@ minecraft {
data {
workingDirectory project.file('run')
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP'
property 'forge.logging.console.level', 'debug'
property 'fml.earlyprogresswindow', 'false'
args '--mod', 'create', '--all', '--output', file('src/generated/resources/')
mods {
create {

View file

@ -67,6 +67,7 @@ public enum AllBlockPartials {
ROPE_COIL("pulley/rope_coil"),
ROPE_HALF("pulley/rope_half"),
ROPE_HALF_MAGNET("pulley/rope_half_magnet"),
MILLSTONE_COG("millstone/inner"),
;

View file

@ -5,6 +5,7 @@ import com.simibubi.create.foundation.block.IHaveCustomBlockItem;
import com.simibubi.create.foundation.block.IHaveNoBlockItem;
import com.simibubi.create.foundation.block.ProperStairsBlock;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.data.ITaggable;
import com.simibubi.create.foundation.world.OxidizingBlock;
import com.simibubi.create.modules.IModule;
import com.simibubi.create.modules.contraptions.CasingBlock;
@ -31,6 +32,7 @@ import com.simibubi.create.modules.contraptions.components.fan.EncasedFanBlock;
import com.simibubi.create.modules.contraptions.components.fan.NozzleBlock;
import com.simibubi.create.modules.contraptions.components.flywheel.FlywheelBlock;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.FurnaceEngineBlock;
import com.simibubi.create.modules.contraptions.components.millstone.MillstoneBlock;
import com.simibubi.create.modules.contraptions.components.mixer.MechanicalMixerBlock;
import com.simibubi.create.modules.contraptions.components.motor.MotorBlock;
import com.simibubi.create.modules.contraptions.components.press.MechanicalPressBlock;
@ -98,12 +100,16 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.color.BlockColors;
import net.minecraft.item.BlockItem;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.ToolType;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.registries.IForgeRegistry;
import java.util.HashSet;
import java.util.Set;
public enum AllBlocks {
__SCHEMATICS__(),
@ -131,6 +137,7 @@ public enum AllBlocks {
CUCKOO_CLOCK(new CuckooClockBlock(false)),
MYSTERIOUS_CUCKOO_CLOCK(new CuckooClockBlock(true)),
MILLSTONE(new MillstoneBlock()),
CRUSHING_WHEEL(new CrushingWheelBlock()),
CRUSHING_WHEEL_CONTROLLER(new CrushingWheelControllerBlock()),
MECHANICAL_PRESS(new MechanicalPressBlock()),
@ -148,7 +155,7 @@ public enum AllBlocks {
ROPE_PULLEY(new PulleyBlock()),
ROPE(new PulleyBlock.RopeBlock()),
PULLEY_MAGNET(new PulleyBlock.MagnetBlock()),
CART_ASSEMBLER(new CartAssemblerBlock()),
CART_ASSEMBLER(new TaggedBlock(new CartAssemblerBlock()).withVanillaTags(ITaggable.TagType.BLOCK, "rails")),
MINECART_ANCHOR(new MinecartAnchorBlock()),
TRANSLATION_CHASSIS(new LinearChassisBlock()),
TRANSLATION_CHASSIS_SECONDARY(new LinearChassisBlock()),
@ -169,7 +176,7 @@ public enum AllBlocks {
FLYWHEEL(new FlywheelBlock()),
FURNACE_ENGINE(new FurnaceEngineBlock()),
ROTATION_SPEED_CONTROLLER(new SpeedControllerBlock()),
__LOGISTICS__(),
CONTACT(new ContactBlock()),
REDSTONE_BRIDGE(new RedstoneLinkBlock()),
@ -198,10 +205,10 @@ public enum AllBlocks {
SYMMETRY_CROSSPLANE(new CrossPlaneSymmetryBlock()),
SYMMETRY_TRIPLEPLANE(new TriplePlaneSymmetryBlock()),
WINDOW_IN_A_BLOCK(new WindowInABlockBlock()),
COCOA_LOG(new CocoaLogBlock()),
COCOA_LOG(new TaggedBlock(new CocoaLogBlock()).withVanillaTags(ITaggable.TagType.BLOCK, "jungle_logs")),
__PALETTES__(),
TILED_GLASS(new GlassBlock(Properties.from(Blocks.GLASS))),
TILED_GLASS(new TaggedBlock(new GlassBlock(Properties.from(Blocks.GLASS))).withVanillaTags(ITaggable.TagType.BLOCK, "impermeable").withForgeTags("glass")),
FRAMED_GLASS(new CTGlassBlock(AllCTs.FRAMED_GLASS, false)),
HORIZONTAL_FRAMED_GLASS(new HorizontalCTGlassBlock(AllCTs.HORIZONTAL_FRAMED_GLASS, AllCTs.FRAMED_GLASS, false)),
VERTICAL_FRAMED_GLASS(new VerticalCTGlassBlock(AllCTs.VERTICAL_FRAMED_GLASS, false)),
@ -214,17 +221,17 @@ public enum AllBlocks {
ACACIA_GLASS(new CTWindowBlock(AllCTs.ACACIA_GLASS, false)),
IRON_GLASS(new CTWindowBlock(AllCTs.IRON_GLASS, false)),
TILED_GLASS_PANE(new GlassPaneBlock(Properties.from(Blocks.GLASS))),
FRAMED_GLASS_PANE(new CTGlassPaneBlock(FRAMED_GLASS.block)),
HORIZONTAL_FRAMED_GLASS_PANE(new CTGlassPaneBlock(HORIZONTAL_FRAMED_GLASS.block)),
VERTICAL_FRAMED_GLASS_PANE(new CTGlassPaneBlock(VERTICAL_FRAMED_GLASS.block)),
OAK_GLASS_PANE(new CTGlassPaneBlock(OAK_GLASS.block)),
SPRUCE_GLASS_PANE(new CTGlassPaneBlock(SPRUCE_GLASS.block)),
BIRCH_GLASS_PANE(new CTGlassPaneBlock(BIRCH_GLASS.block)),
JUNGLE_GLASS_PANE(new CTGlassPaneBlock(JUNGLE_GLASS.block)),
DARK_OAK_GLASS_PANE(new CTGlassPaneBlock(DARK_OAK_GLASS.block)),
ACACIA_GLASS_PANE(new CTGlassPaneBlock(ACACIA_GLASS.block)),
IRON_GLASS_PANE(new CTGlassPaneBlock(IRON_GLASS.block)),
TILED_GLASS_PANE(new TaggedBlock(new GlassPaneBlock(Properties.from(Blocks.GLASS))).withForgeTags("glass_panes")),
FRAMED_GLASS_PANE(new CTGlassPaneBlock(FRAMED_GLASS.get())),
HORIZONTAL_FRAMED_GLASS_PANE(new CTGlassPaneBlock(HORIZONTAL_FRAMED_GLASS.get())),
VERTICAL_FRAMED_GLASS_PANE(new CTGlassPaneBlock(VERTICAL_FRAMED_GLASS.get())),
OAK_GLASS_PANE(new CTGlassPaneBlock(OAK_GLASS.get())),
SPRUCE_GLASS_PANE(new CTGlassPaneBlock(SPRUCE_GLASS.get())),
BIRCH_GLASS_PANE(new CTGlassPaneBlock(BIRCH_GLASS.get())),
JUNGLE_GLASS_PANE(new CTGlassPaneBlock(JUNGLE_GLASS.get())),
DARK_OAK_GLASS_PANE(new CTGlassPaneBlock(DARK_OAK_GLASS.get())),
ACACIA_GLASS_PANE(new CTGlassPaneBlock(ACACIA_GLASS.get())),
IRON_GLASS_PANE(new CTGlassPaneBlock(IRON_GLASS.get())),
GRANITE_BRICKS(new Block(Properties.from(Blocks.GRANITE))),
GRANITE_LAYERS(new LayeredCTBlock(Properties.from(Blocks.GRANITE), AllCTs.GRANITE_LAYERS, AllCTs.POLISHED_GRANITE)),
@ -234,86 +241,89 @@ public enum AllBlocks {
ANDESITE_LAYERS(
new LayeredCTBlock(Properties.from(Blocks.ANDESITE), AllCTs.ANDESITE_LAYERS, AllCTs.POLISHED_ANDESITE)),
GABBRO(new Block(Properties.from(Blocks.GRANITE)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
POLISHED_GABBRO(new Block(Properties.from(GABBRO.block))),
GABBRO_BRICKS(new Block(Properties.from(GABBRO.block)), ComesWith.STAIRS, ComesWith.WALL),
PAVED_GABBRO_BRICKS(new Block(Properties.from(GABBRO.block)), ComesWith.SLAB),
INDENTED_GABBRO(new Block(Properties.from(GABBRO.block)), ComesWith.SLAB),
SLIGHTLY_MOSSY_GABBRO_BRICKS(new Block(Properties.from(GABBRO.block))),
MOSSY_GABBRO_BRICKS(new Block(Properties.from(GABBRO.block))),
GABBRO_LAYERS(new LayeredCTBlock(Properties.from(GABBRO.block), AllCTs.GABBRO_LAYERS, AllCTs.POLISHED_GABBRO)),
GABBRO(new TaggedBlock(new Block(Properties.from(Blocks.GRANITE))).withForgeTags("stone"), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
POLISHED_GABBRO(new TaggedBlock(new Block(Properties.from(GABBRO.get()))).withForgeTags("stone")),
GABBRO_BRICKS(new Block(Properties.from(GABBRO.get())), ComesWith.STAIRS, ComesWith.WALL),
PAVED_GABBRO_BRICKS(new Block(Properties.from(GABBRO.get())), ComesWith.SLAB),
INDENTED_GABBRO(new Block(Properties.from(GABBRO.get())), ComesWith.SLAB),
SLIGHTLY_MOSSY_GABBRO_BRICKS(new Block(Properties.from(GABBRO.get()))),
MOSSY_GABBRO_BRICKS(new Block(Properties.from(GABBRO.get()))),
GABBRO_LAYERS(new LayeredCTBlock(Properties.from(GABBRO.get()), AllCTs.GABBRO_LAYERS, AllCTs.POLISHED_GABBRO)),
DOLOMITE(new Block(Properties.from(Blocks.QUARTZ_BLOCK)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
DOLOMITE_BRICKS(new Block(Properties.from(DOLOMITE.block))),
POLISHED_DOLOMITE(new Block(Properties.from(DOLOMITE.block))),
DOLOMITE_PILLAR(new RotatedPillarBlock(Properties.from(DOLOMITE.block))),
DOLOMITE(new TaggedBlock(new Block(Properties.from(Blocks.QUARTZ_BLOCK))).withForgeTags("stone"), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
DOLOMITE_BRICKS(new Block(Properties.from(DOLOMITE.get()))),
POLISHED_DOLOMITE(new TaggedBlock(new Block(Properties.from(DOLOMITE.get()))).withForgeTags("stone")),
DOLOMITE_PILLAR(new RotatedPillarBlock(Properties.from(DOLOMITE.get()))),
DOLOMITE_LAYERS(
new LayeredCTBlock(Properties.from(DOLOMITE.block), AllCTs.DOLOMITE_LAYERS, AllCTs.POLISHED_DOLOMITE)),
new LayeredCTBlock(Properties.from(DOLOMITE.get()), AllCTs.DOLOMITE_LAYERS, AllCTs.POLISHED_DOLOMITE)),
LIMESAND(new FallingBlock(Properties.from(Blocks.SAND))),
LIMESTONE(new Block(Properties.from(Blocks.SANDSTONE)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
LIMESTONE_BRICKS(new Block(Properties.from(LIMESTONE.block)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
POLISHED_LIMESTONE(new Block(Properties.from(LIMESTONE.block)), ComesWith.SLAB),
LIMESTONE_PILLAR(new RotatedPillarBlock(Properties.from(LIMESTONE.block))),
LIMESTONE(new TaggedBlock(new Block(Properties.from(Blocks.SANDSTONE))).withForgeTags("stone"), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
LIMESTONE_BRICKS(new Block(Properties.from(LIMESTONE.get())), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
POLISHED_LIMESTONE(new TaggedBlock(new Block(Properties.from(LIMESTONE.get()))).withForgeTags("stone"), ComesWith.SLAB),
LIMESTONE_PILLAR(new RotatedPillarBlock(Properties.from(LIMESTONE.get()))),
LIMESTONE_LAYERS(
new LayeredCTBlock(Properties.from(LIMESTONE.block), AllCTs.LIMESTONE_LAYERS, AllCTs.POLISHED_LIMESTONE)),
WEATHERED_LIMESTONE(new Block(Properties.from(Blocks.ANDESITE)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
WEATHERED_LIMESTONE_BRICKS(new Block(Properties.from(WEATHERED_LIMESTONE.block)), ComesWith.STAIRS, ComesWith.SLAB,
new LayeredCTBlock(Properties.from(LIMESTONE.get()), AllCTs.LIMESTONE_LAYERS, AllCTs.POLISHED_LIMESTONE)),
WEATHERED_LIMESTONE(new TaggedBlock(new Block(Properties.from(Blocks.ANDESITE))).withForgeTags("stone"), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
WEATHERED_LIMESTONE_BRICKS(new Block(Properties.from(WEATHERED_LIMESTONE.get())), ComesWith.STAIRS, ComesWith.SLAB,
ComesWith.WALL),
POLISHED_WEATHERED_LIMESTONE(new Block(Properties.from(WEATHERED_LIMESTONE.block)), ComesWith.SLAB),
WEATHERED_LIMESTONE_PILLAR(new RotatedPillarBlock(Properties.from(WEATHERED_LIMESTONE.block))),
WEATHERED_LIMESTONE_LAYERS(new LayeredCTBlock(Properties.from(WEATHERED_LIMESTONE.block),
POLISHED_WEATHERED_LIMESTONE(new TaggedBlock(new Block(Properties.from(WEATHERED_LIMESTONE.get()))).withForgeTags("stone"), ComesWith.SLAB),
WEATHERED_LIMESTONE_PILLAR(new RotatedPillarBlock(Properties.from(WEATHERED_LIMESTONE.get()))),
WEATHERED_LIMESTONE_LAYERS(new LayeredCTBlock(Properties.from(WEATHERED_LIMESTONE.get()),
AllCTs.WEATHERED_LIMESTONE_LAYERS, AllCTs.POLISHED_WEATHERED_LIMESTONE)),
NATURAL_SCORIA(new ScoriaBlock()),
SCORIA(new Block(Properties.from(Blocks.ANDESITE)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
POLISHED_SCORIA(new Block(Properties.from(SCORIA.block)), ComesWith.SLAB),
SCORIA_BRICKS(new Block(Properties.from(SCORIA.block))),
SCORIA_LAYERS(new LayeredCTBlock(Properties.from(SCORIA.block), AllCTs.SCORIA_LAYERS, AllCTs.POLISHED_SCORIA)),
SCORIA_PILLAR(new RotatedPillarBlock(Properties.from(SCORIA.block))),
SCORIA(new TaggedBlock(new Block(Properties.from(Blocks.ANDESITE))).withForgeTags("stone"), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
POLISHED_SCORIA(new TaggedBlock(new Block(Properties.from(SCORIA.get()))).withForgeTags("stone"), ComesWith.SLAB),
SCORIA_BRICKS(new Block(Properties.from(SCORIA.get()))),
SCORIA_LAYERS(new LayeredCTBlock(Properties.from(SCORIA.get()), AllCTs.SCORIA_LAYERS, AllCTs.POLISHED_SCORIA)),
SCORIA_PILLAR(new RotatedPillarBlock(Properties.from(SCORIA.get()))),
DARK_SCORIA(new Block(Properties.from(Blocks.ANDESITE))),
POLISHED_DARK_SCORIA(new Block(Properties.from(DARK_SCORIA.block))),
DARK_SCORIA_TILES(new Block(Properties.from(DARK_SCORIA.block)), ComesWith.STAIRS, ComesWith.SLAB),
DARK_SCORIA_BRICKS(new Block(Properties.from(DARK_SCORIA.block)), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
POLISHED_DARK_SCORIA(new Block(Properties.from(DARK_SCORIA.get()))),
DARK_SCORIA_TILES(new Block(Properties.from(DARK_SCORIA.get())), ComesWith.STAIRS, ComesWith.SLAB),
DARK_SCORIA_BRICKS(new Block(Properties.from(DARK_SCORIA.get())), ComesWith.STAIRS, ComesWith.SLAB, ComesWith.WALL),
__MATERIALS__(),
COPPER_ORE(new OxidizingBlock(Properties.from(Blocks.IRON_ORE), 1)),
ZINC_ORE(new Block(Properties.from(Blocks.GOLD_ORE).harvestLevel(2).harvestTool(ToolType.PICKAXE))),
COPPER_BLOCK(new OxidizingBlock(Properties.from(Blocks.IRON_BLOCK), 1/32f)),
COPPER_SHINGLES(new OxidizingBlock(Properties.from(Blocks.IRON_BLOCK), 1/32f)),
COPPER_ORE(new TaggedBlock(new OxidizingBlock(Properties.from(Blocks.IRON_ORE), 1)).withForgeTags("ores/copper")),
ZINC_ORE(new TaggedBlock(new Block(Properties.from(Blocks.GOLD_ORE).harvestLevel(2).harvestTool(ToolType.PICKAXE))).withForgeTags("ores/zinc")),
COPPER_BLOCK(new TaggedBlock(new OxidizingBlock(Properties.from(Blocks.IRON_BLOCK), 1 / 32f)).withForgeTags("storage_blocks/copper")),
COPPER_SHINGLES(new OxidizingBlock(Properties.from(Blocks.IRON_BLOCK), 1 / 32f)),
ZINC_BLOCK(new TaggedBlock(new Block(Properties.from(Blocks.IRON_BLOCK))).withForgeTags("storage_blocks/zinc")),
BRASS_BLOCK(new TaggedBlock(new Block(Properties.from(Blocks.IRON_BLOCK))).withForgeTags("storage_blocks/brass")),
;
private enum ComesWith {
WALL, FENCE, FENCE_GATE, SLAB, STAIRS;
WALL, FENCE, FENCE_GATE, SLAB, STAIRS
}
private static class CategoryTracker {
static IModule currentModule;
}
public Block block;
public Block[] alsoRegistered;
private TaggedBlock taggedBlock;
public TaggedBlock[] alsoRegistered;
public IModule module;
private AllBlocks() {
CategoryTracker.currentModule = new IModule() {
@Override
public String getModuleName() {
return Lang.asId(name()).replaceAll("__", "");
}
};
AllBlocks() {
CategoryTracker.currentModule = () -> Lang.asId(name()).replaceAll("__", "");
taggedBlock = new TaggedBlock(null);
}
private AllBlocks(Block block, ComesWith... comesWith) {
this.block = block;
this.block.setRegistryName(Create.ID, Lang.asId(name()));
AllBlocks(Block block, ComesWith... comesWith) {
this(new TaggedBlock(block), comesWith);
}
AllBlocks(TaggedBlock taggedBlockIn, ComesWith... comesWith){
this.taggedBlock = taggedBlockIn;
this.taggedBlock.getBlock().setRegistryName(Create.ID, Lang.asId(name()));
this.module = CategoryTracker.currentModule;
alsoRegistered = new Block[comesWith.length];
alsoRegistered = new TaggedBlock[comesWith.length];
for (int i = 0; i < comesWith.length; i++)
alsoRegistered[i] = makeRelatedBlock(block, comesWith[i]);
alsoRegistered[i] = makeRelatedBlock(taggedBlock.getBlock(), comesWith[i]);
}
public static void register(RegistryEvent.Register<Block> event) {
@ -323,9 +333,9 @@ public enum AllBlocks {
if (block.get() == null)
continue;
registry.register(block.block);
for (Block extra : block.alsoRegistered)
registry.register(extra);
registry.register(block.get());
for (TaggedBlock extra : block.alsoRegistered)
registry.register(extra.block);
}
}
@ -338,13 +348,13 @@ public enum AllBlocks {
continue;
registerAsItem(registry, def);
for (Block extra : block.alsoRegistered)
registerAsItem(registry, extra);
for (TaggedBlock extra : block.alsoRegistered)
registerAsItem(registry, extra.block);
}
}
private static void registerAsItem(IForgeRegistry<Item> registry, Block blockIn) {
BlockItem blockItem = null;
BlockItem blockItem;
Item.Properties standardItemProperties = AllItems.includeInItemGroup();
if (blockIn instanceof IHaveCustomBlockItem)
@ -356,52 +366,77 @@ public enum AllBlocks {
}
public Block get() {
return block;
return taggedBlock.getBlock();
}
public ITaggable<?> getTaggable() {
return taggedBlock;
}
public BlockState getDefault() {
return block.getDefaultState();
return get().getDefaultState();
}
public boolean typeOf(BlockState state) {
return state.getBlock() == block;
return state.getBlock() == get();
}
private Block makeRelatedBlock(Block block, ComesWith feature) {
private TaggedBlock makeRelatedBlock(Block block, ComesWith feature) {
Properties properties = Properties.from(block);
Block featured = null;
TaggedBlock featured;
switch (feature) {
case FENCE:
featured = new FenceBlock(properties);
featured = new TaggedBlock(new FenceBlock(properties)).withVanillaTags(ITaggable.TagType.BLOCK, "fences");
break;
case SLAB:
featured = new SlabBlock(properties);
featured = new TaggedBlock(new SlabBlock(properties)).withVanillaTags(ITaggable.TagType.BLOCK, "slabs");
break;
case STAIRS:
featured = new ProperStairsBlock(block);
featured = new TaggedBlock(new ProperStairsBlock(block)).withVanillaTags(ITaggable.TagType.BLOCK, "stairs");
break;
case WALL:
featured = new WallBlock(properties);
featured = new TaggedBlock(new WallBlock(properties)).withVanillaTags(ITaggable.TagType.BLOCK, "walls");
break;
case FENCE_GATE:
featured = new FenceGateBlock(properties);
featured = new TaggedBlock(new FenceGateBlock(properties));
break;
default:
return null;
}
return featured.setRegistryName(Create.ID, block.getRegistryName().getPath() + "_" + Lang.asId(feature.name()));
featured.block.setRegistryName(Create.ID, block.getRegistryName().getPath() + "_" + Lang.asId(feature.name()));
return featured;
}
@OnlyIn(Dist.CLIENT)
public static void registerColorHandlers() {
BlockColors blockColors = Minecraft.getInstance().getBlockColors();
for (AllBlocks block : values()) {
if (block.block instanceof IHaveColorHandler) {
blockColors.register(((IHaveColorHandler) block.block).getColorHandler(), block.block);
if (block.get() instanceof IHaveColorHandler) {
blockColors.register(((IHaveColorHandler) block.get()).getColorHandler(), block.get());
}
}
}
public static class TaggedBlock implements ITaggable<TaggedBlock> {
//A wrapper around Block that allows for tags to be included. needed for datagen
private Set<ResourceLocation> tagSetBlock = new HashSet<>();
private Set<ResourceLocation> tagSetBlockItem = new HashSet<>();
private Block block;
public TaggedBlock(Block blockIn){
block = blockIn;
}
public Block getBlock() {
return block;
}
@Override
public Set<ResourceLocation> getTagSet(TagType type) {
return type == TagType.BLOCK ? tagSetBlock : tagSetBlockItem;
}
}
}

View file

@ -4,13 +4,15 @@ import static com.simibubi.create.foundation.item.AllToolTypes.AXE;
import static com.simibubi.create.foundation.item.AllToolTypes.HOE;
import static com.simibubi.create.foundation.item.AllToolTypes.PICKAXE;
import static com.simibubi.create.foundation.item.AllToolTypes.SHOVEL;
import static com.simibubi.create.foundation.item.AllToolTypes.SWORD;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;
import com.simibubi.create.foundation.item.IHaveCustomItemModel;
import com.simibubi.create.foundation.item.IItemWithColorHandler;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.data.ITaggable;
import com.simibubi.create.modules.IModule;
import com.simibubi.create.modules.contraptions.GogglesItem;
import com.simibubi.create.modules.contraptions.WrenchItem;
@ -21,6 +23,7 @@ import com.simibubi.create.modules.curiosities.RefinedRadianceItem;
import com.simibubi.create.modules.curiosities.ShadowSteelItem;
import com.simibubi.create.modules.curiosities.deforester.DeforesterItem;
import com.simibubi.create.modules.curiosities.symmetry.SymmetryWandItem;
import com.simibubi.create.modules.curiosities.tools.AllToolTiers;
import com.simibubi.create.modules.curiosities.tools.BlazingToolItem;
import com.simibubi.create.modules.curiosities.tools.RoseQuartzToolItem;
import com.simibubi.create.modules.curiosities.tools.SandPaperItem;
@ -39,6 +42,8 @@ import net.minecraft.item.Item;
import net.minecraft.item.Item.Properties;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Rarity;
import net.minecraft.util.ResourceLocation;
import net.minecraft.item.SwordItem;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.event.RegistryEvent;
@ -50,14 +55,14 @@ import net.minecraftforge.registries.IForgeRegistry;
public enum AllItems {
__MATERIALS__(module()),
COPPER_NUGGET,
ZINC_NUGGET,
BRASS_NUGGET,
IRON_SHEET,
GOLD_SHEET,
COPPER_SHEET,
BRASS_SHEET,
LAPIS_PLATE,
COPPER_NUGGET(new TaggedItem().withForgeTags("nuggets/copper")),
ZINC_NUGGET(new TaggedItem().withForgeTags("nuggets/zinc")),
BRASS_NUGGET(new TaggedItem().withForgeTags("nuggets/brass")),
IRON_SHEET(new TaggedItem().withForgeTags("plates/iron")),
GOLD_SHEET(new TaggedItem().withForgeTags("plates/gold")),
COPPER_SHEET(new TaggedItem().withForgeTags("plates/copper")),
BRASS_SHEET(new TaggedItem().withForgeTags("plates/brass")),
LAPIS_PLATE(new TaggedItem().withForgeTags("plates/lapis")),
CRUSHED_IRON,
CRUSHED_GOLD,
@ -66,9 +71,9 @@ public enum AllItems {
CRUSHED_BRASS,
ANDESITE_ALLOY,
COPPER_INGOT,
ZINC_INGOT,
BRASS_INGOT,
COPPER_INGOT(new TaggedItem().withForgeTags("ingots/copper")),
ZINC_INGOT(new TaggedItem().withForgeTags("ingots/zinc")),
BRASS_INGOT(new TaggedItem().withForgeTags("ingots/brass")),
SAND_PAPER(SandPaperItem::new),
RED_SAND_PAPER(SandPaperItem::new),
@ -113,16 +118,16 @@ public enum AllItems {
BLAZING_PICKAXE(p -> new BlazingToolItem(1, -2.8F, p, PICKAXE)),
BLAZING_SHOVEL(p -> new BlazingToolItem(1.5F, -3.0F, p, SHOVEL)),
BLAZING_AXE(p -> new BlazingToolItem(5.0F, -3.0F, p, AXE)),
BLAZING_SWORD(p -> new BlazingToolItem(3, -2.4F, p, SWORD)),
BLAZING_SWORD(p -> new SwordItem(AllToolTiers.BLAZING, 3, -2.4F, p)),
ROSE_QUARTZ_PICKAXE(p -> new RoseQuartzToolItem(1, -2.8F, p, PICKAXE)),
ROSE_QUARTZ_SHOVEL(p -> new RoseQuartzToolItem(1.5F, -3.0F, p, SHOVEL)),
ROSE_QUARTZ_AXE(p -> new RoseQuartzToolItem(5.0F, -3.0F, p, AXE)),
ROSE_QUARTZ_SWORD(p -> new RoseQuartzToolItem(3, -2.4F, p, SWORD)),
ROSE_QUARTZ_SWORD(p -> new SwordItem(AllToolTiers.ROSE_QUARTZ, 3, -2.4F, p)),
SHADOW_STEEL_PICKAXE(p -> new ShadowSteelToolItem(2.5F, -2.0F, p, PICKAXE)),
SHADOW_STEEL_MATTOCK(p -> new ShadowSteelToolItem(2.5F, -1.5F, p, SHOVEL, AXE, HOE)),
SHADOW_STEEL_SWORD(p -> new ShadowSteelToolItem(3, -2.0F, p, SWORD)),
SHADOW_STEEL_SWORD(p -> new SwordItem(AllToolTiers.SHADOW_STEEL, 3, -2.0F, p)),
;
@ -134,28 +139,32 @@ public enum AllItems {
public IModule module;
private Function<Properties, Properties> specialProperties;
private Function<Properties, Item> itemSupplier;
private TaggedItem taggedItem;
private Item item;
private AllItems(int moduleMarker) {
CategoryTracker.currentModule = new IModule() {
@Override
public String getModuleName() {
return Lang.asId(name()).replaceAll("__", "");
}
};
AllItems(int moduleMarker) {
CategoryTracker.currentModule = () -> Lang.asId(name()).replaceAll("__", "");
taggedItem = new TaggedItem(null);
}
private AllItems() {
this(Item::new);
AllItems(Function<Properties, Item> itemSupplier) {
this(new TaggedItem(itemSupplier), Function.identity());
}
private AllItems(Function<Properties, Item> itemSupplier) {
this(itemSupplier, Function.identity());
AllItems(Function<Properties, Item> itemSupplier, Function<Properties, Properties> specialProperties) {
this(new TaggedItem(itemSupplier), specialProperties);
}
private AllItems(Function<Properties, Item> itemSupplier, Function<Properties, Properties> specialProperties) {
this.itemSupplier = itemSupplier;
AllItems() {
this(new TaggedItem(Item::new));
}
AllItems(TaggedItem taggedItemIn) {
this(taggedItemIn, Function.identity());
}
AllItems(TaggedItem taggedItemIn, Function<Properties, Properties> specialProperties) {
this.taggedItem = taggedItemIn;
this.module = CategoryTracker.currentModule;
this.specialProperties = specialProperties;
}
@ -184,11 +193,11 @@ public enum AllItems {
IForgeRegistry<Item> registry = event.getRegistry();
for (AllItems entry : values()) {
if (entry.itemSupplier == null)
if (entry.taggedItem == null || entry.taggedItem.getItemSupplier() == null)
continue;
entry.item = entry.itemSupplier.apply(new Properties());
entry.item = entry.itemSupplier.apply(entry.specialProperties.apply(defaultProperties(entry)));
entry.item = entry.taggedItem.getItemSupplier().apply(new Properties());
entry.item = entry.taggedItem.getItemSupplier().apply(entry.specialProperties.apply(defaultProperties(entry)));
entry.item.setRegistryName(Create.ID, Lang.asId(entry.name()));
registry.register(entry.item);
}
@ -200,6 +209,10 @@ public enum AllItems {
return item;
}
public TaggedItem getTaggable() {
return taggedItem;
}
public boolean typeOf(ItemStack stack) {
return stack.getItem() == item;
}
@ -208,6 +221,29 @@ public enum AllItems {
return new ItemStack(item);
}
public static class TaggedItem implements ITaggable<TaggedItem> {
private Set<ResourceLocation> tagSetItem = new HashSet<>();
private Function<Properties, Item> itemSupplier;
public TaggedItem(){
this(Item::new);
}
public TaggedItem(Function<Properties, Item> itemSupplierIn){
this.itemSupplier = itemSupplierIn;
}
public Function<Properties, Item> getItemSupplier() {
return itemSupplier;
}
@Override
public Set<ResourceLocation> getTagSet(TagType type) {
return tagSetItem;
}
}
// Client
@OnlyIn(Dist.CLIENT)

View file

@ -7,6 +7,7 @@ import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.components.crafter.MechanicalCraftingRecipe;
import com.simibubi.create.modules.contraptions.components.crusher.CrushingRecipe;
import com.simibubi.create.modules.contraptions.components.fan.SplashingRecipe;
import com.simibubi.create.modules.contraptions.components.millstone.MillingRecipe;
import com.simibubi.create.modules.contraptions.components.mixer.MixingRecipe;
import com.simibubi.create.modules.contraptions.components.press.PressingRecipe;
import com.simibubi.create.modules.contraptions.components.saw.CuttingRecipe;
@ -30,6 +31,7 @@ public enum AllRecipes {
BLOCKZAPPER_UPGRADE(BlockzapperUpgradeRecipe.Serializer::new, IRecipeType.CRAFTING),
MECHANICAL_CRAFTING(MechanicalCraftingRecipe.Serializer::new),
CRUSHING(processingSerializer(CrushingRecipe::new)),
MILLING(processingSerializer(MillingRecipe::new)),
SPLASHING(processingSerializer(SplashingRecipe::new)),
PRESSING(processingSerializer(PressingRecipe::new)),
CUTTING(processingSerializer(CuttingRecipe::new)),

View file

@ -1,11 +1,14 @@
package com.simibubi.create;
import java.io.IOException;
import java.nio.file.Path;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.data.ICanGenerateJson;
import net.minecraft.data.DirectoryCache;
import net.minecraft.data.IDataProvider;
import net.minecraft.util.ResourceLocation;
@ -14,10 +17,7 @@ import net.minecraft.util.SoundEvents;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.registries.IForgeRegistry;
import java.io.IOException;
import java.nio.file.Path;
public enum AllSoundEvents implements ICanGenerateJson {
public enum AllSoundEvents implements IDataProvider {
CUCKOO_PIG("creeperclock"),
CUCKOO_CREEPER("pigclock"),
@ -58,7 +58,7 @@ public enum AllSoundEvents implements ICanGenerateJson {
return event;
}
private String getName() {
private String getEventName() {
return id;
}
@ -67,7 +67,7 @@ public enum AllSoundEvents implements ICanGenerateJson {
for (AllSoundEvents entry : values()) {
ResourceLocation rec = new ResourceLocation(Create.ID, entry.getName());
ResourceLocation rec = new ResourceLocation(Create.ID, entry.getEventName());
SoundEvent sound = new SoundEvent(rec).setRegistryName(rec);
registry.register(sound);
entry.event = sound;
@ -91,11 +91,11 @@ public enum AllSoundEvents implements ICanGenerateJson {
arr.add(s);
} else {
// own sound
arr.add(Create.ID + ":" + soundEvent.getName());
arr.add(Create.ID + ":" + soundEvent.getEventName());
}
entry.add("sounds", arr);
entry.addProperty("subtitle", Create.ID + ".subtitle." + soundEvent.getName());
json.add(soundEvent.getName(), entry);
entry.addProperty("subtitle", Create.ID + ".subtitle." + soundEvent.getEventName());
json.add(soundEvent.getEventName(), entry);
}
IDataProvider.save(GSON, cache, json, path.resolve("sounds.json"));
@ -104,4 +104,14 @@ public enum AllSoundEvents implements ICanGenerateJson {
}
}
@Override
public void act(DirectoryCache cache) throws IOException {
}
@Override
public String getName() {
return null;
}
}

View file

@ -34,6 +34,8 @@ import com.simibubi.create.modules.contraptions.components.flywheel.FlywheelRend
import com.simibubi.create.modules.contraptions.components.flywheel.FlywheelTileEntity;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.EngineRenderer;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.FurnaceEngineTileEntity;
import com.simibubi.create.modules.contraptions.components.millstone.MillstoneRenderer;
import com.simibubi.create.modules.contraptions.components.millstone.MillstoneTileEntity;
import com.simibubi.create.modules.contraptions.components.mixer.MechanicalMixerTileEntity;
import com.simibubi.create.modules.contraptions.components.mixer.MechanicalMixerTileEntityRenderer;
import com.simibubi.create.modules.contraptions.components.motor.MotorTileEntity;
@ -129,6 +131,8 @@ public enum AllTileEntities {
HARVESTER(HarvesterTileEntity::new, AllBlocks.HARVESTER),
FLYWHEEL(FlywheelTileEntity::new, AllBlocks.FLYWHEEL),
FURNACE_ENGINE(FurnaceEngineTileEntity::new, AllBlocks.FURNACE_ENGINE),
MILLSTONE(MillstoneTileEntity::new, AllBlocks.MILLSTONE),
CRUSHING_WHEEL(CrushingWheelTileEntity::new, AllBlocks.CRUSHING_WHEEL),
CRUSHING_WHEEL_CONTROLLER(CrushingWheelControllerTileEntity::new, AllBlocks.CRUSHING_WHEEL_CONTROLLER),
WATER_WHEEL(WaterWheelTileEntity::new, AllBlocks.WATER_WHEEL),
@ -179,7 +183,7 @@ public enum AllTileEntities {
for (AllTileEntities tileEntity : values()) {
Block[] blocks = new Block[tileEntity.blocks.length];
for (int i = 0; i < blocks.length; i++)
blocks[i] = tileEntity.blocks[i].block;
blocks[i] = tileEntity.blocks[i].get();
ResourceLocation resourceLocation = new ResourceLocation(Create.ID, Lang.asId(tileEntity.name()));
tileEntity.type = TileEntityType.Builder.create(tileEntity.supplier, blocks).build(null)
@ -216,6 +220,7 @@ public enum AllTileEntities {
bind(PulleyTileEntity.class, new PulleyRenderer());
bind(HarvesterTileEntity.class, new HarvesterTileEntityRenderer());
bind(MillstoneTileEntity.class, new MillstoneRenderer());
bind(CrushingWheelTileEntity.class, new KineticTileEntityRenderer());
bind(MechanicalPressTileEntity.class, new MechanicalPressTileEntityRenderer());
bind(MechanicalMixerTileEntity.class, new MechanicalMixerTileEntityRenderer());

View file

@ -1,11 +1,10 @@
package com.simibubi.create;
import com.simibubi.create.foundation.advancement.AllTriggers;
import net.minecraft.util.SoundEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.foundation.advancement.AllTriggers;
import com.simibubi.create.foundation.command.CreateCommand;
import com.simibubi.create.foundation.command.ServerLagger;
import com.simibubi.create.foundation.world.AllWorldFeatures;
@ -22,6 +21,7 @@ import net.minecraft.item.ItemGroup;
import net.minecraft.item.crafting.IRecipeSerializer;
import net.minecraft.particles.ParticleType;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.SoundEvent;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.crafting.CraftingHelper;
import net.minecraftforge.eventbus.api.IEventBus;

View file

@ -147,7 +147,7 @@ public class CreateClient {
@OnlyIn(Dist.CLIENT)
protected static ModelResourceLocation getBlockModelLocation(AllBlocks block, String suffix) {
return new ModelResourceLocation(block.block.getRegistryName(), suffix);
return new ModelResourceLocation(block.get().getRegistryName(), suffix);
}
@OnlyIn(Dist.CLIENT)

View file

@ -46,8 +46,8 @@ public final class CreateItemGroup extends ItemGroup {
continue;
def.asItem().fillItemGroup(this, items);
for (Block alsoRegistered : block.alsoRegistered)
alsoRegistered.asItem().fillItemGroup(this, items);
for (AllBlocks.TaggedBlock alsoRegistered : block.alsoRegistered)
alsoRegistered.getBlock().asItem().fillItemGroup(this, items);
}
}

View file

@ -15,6 +15,7 @@ import com.simibubi.create.compat.jei.category.BlockCuttingCategory.CondensedBlo
import com.simibubi.create.compat.jei.category.BlockzapperUpgradeCategory;
import com.simibubi.create.compat.jei.category.CrushingCategory;
import com.simibubi.create.compat.jei.category.MechanicalCraftingCategory;
import com.simibubi.create.compat.jei.category.MillingCategory;
import com.simibubi.create.compat.jei.category.MixingCategory;
import com.simibubi.create.compat.jei.category.MysteriousItemConversionCategory;
import com.simibubi.create.compat.jei.category.PackingCategory;
@ -55,6 +56,7 @@ import net.minecraft.util.text.TextFormatting;
public class CreateJEI implements IModPlugin {
private static ResourceLocation ID = new ResourceLocation(Create.ID, "jei_plugin");
private MillingCategory millingCategory;
private CrushingCategory crushingCategory;
private SplashingCategory splashingCategory;
private SmokingViaFanCategory smokingCategory;
@ -76,6 +78,7 @@ public class CreateJEI implements IModPlugin {
}
public CreateJEI() {
millingCategory = new MillingCategory();
crushingCategory = new CrushingCategory();
splashingCategory = new SplashingCategory();
pressingCategory = new PressingCategory();
@ -99,15 +102,18 @@ public class CreateJEI implements IModPlugin {
@Override
public void registerCategories(IRecipeCategoryRegistration registration) {
registration.addRecipeCategories(crushingCategory, splashingCategory, pressingCategory, smokingCategory,
blastingCategory, blockzapperCategory, mixingCategory, sawingCategory, blockCuttingCategory,
packingCategory, polishingCategory, mysteryConversionCategory, smallMechanicalCraftingCategory,
largeMechanicalCraftingCategory);
registration.addRecipeCategories(millingCategory, crushingCategory, splashingCategory, pressingCategory,
smokingCategory, blastingCategory, blockzapperCategory, mixingCategory, sawingCategory,
blockCuttingCategory, packingCategory, polishingCategory, mysteryConversionCategory,
smallMechanicalCraftingCategory, largeMechanicalCraftingCategory);
}
@Override
public void registerRecipes(IRecipeRegistration registration) {
registration.addRecipes(findRecipes(AllRecipes.MILLING), millingCategory.getUid());
registration.addRecipes(findRecipes(AllRecipes.CRUSHING), crushingCategory.getUid());
registration.addRecipes(findRecipesByTypeExcluding(AllRecipes.MILLING.getType(), AllRecipes.CRUSHING.getType()),
crushingCategory.getUid());
registration.addRecipes(findRecipes(AllRecipes.SPLASHING), splashingCategory.getUid());
registration.addRecipes(findRecipes(AllRecipes.PRESSING), pressingCategory.getUid());
registration.addRecipes(findRecipesById(AllRecipes.BLOCKZAPPER_UPGRADE.serializer.getRegistryName()),
@ -134,11 +140,14 @@ public class CreateJEI implements IModPlugin {
r -> (r instanceof MechanicalCraftingRecipe) && MechanicalCraftingCategory.isSmall((ShapedRecipe) r)),
smallMechanicalCraftingCategory.getUid());
registration.addRecipes(
findRecipes(r -> (r instanceof ShapedRecipe) && !(r instanceof MechanicalCraftingRecipe)
&& MechanicalCraftingCategory.isSmall((ShapedRecipe) r)),
findRecipes(
r -> (r.getType() == IRecipeType.CRAFTING || r.getType() == AllRecipes.MECHANICAL_CRAFTING.type)
&& (r instanceof ShapedRecipe) && !(r instanceof MechanicalCraftingRecipe)
&& MechanicalCraftingCategory.isSmall((ShapedRecipe) r)),
smallMechanicalCraftingCategory.getUid());
registration.addRecipes(
findRecipes(r -> (r instanceof ShapedRecipe) && !MechanicalCraftingCategory.isSmall((ShapedRecipe) r)),
registration.addRecipes(findRecipes(
r -> (r.getType() == IRecipeType.CRAFTING || r.getType() == AllRecipes.MECHANICAL_CRAFTING.type)
&& (r instanceof ShapedRecipe) && !MechanicalCraftingCategory.isSmall((ShapedRecipe) r)),
largeMechanicalCraftingCategory.getUid());
}
@ -154,6 +163,7 @@ public class CreateJEI implements IModPlugin {
ItemStack blastingFan = fan.copy().setDisplayName(
new StringTextComponent(TextFormatting.RESET + Lang.translate("recipe.blastingViaFan.fan")));
registration.addRecipeCatalyst(new ItemStack(AllBlocks.MILLSTONE.get()), millingCategory.getUid());
registration.addRecipeCatalyst(new ItemStack(AllBlocks.CRUSHING_WHEEL.get()), crushingCategory.getUid());
registration.addRecipeCatalyst(splashingFan, splashingCategory.getUid());
registration.addRecipeCatalyst(smokingFan, smokingCategory.getUid());

View file

@ -12,7 +12,7 @@ import com.simibubi.create.compat.jei.DoubleItemIcon;
import com.simibubi.create.compat.jei.EmptyBackground;
import com.simibubi.create.compat.jei.category.animations.AnimatedCrushingWheels;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.components.crusher.CrushingRecipe;
import com.simibubi.create.modules.contraptions.components.crusher.AbstractCrushingRecipe;
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
import mezz.jei.api.constants.VanillaTypes;
@ -24,7 +24,7 @@ import mezz.jei.api.recipe.category.IRecipeCategory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class CrushingCategory implements IRecipeCategory<CrushingRecipe> {
public class CrushingCategory implements IRecipeCategory<AbstractCrushingRecipe> {
private static ResourceLocation ID = new ResourceLocation(Create.ID, "crushing");
private AnimatedCrushingWheels crushingWheels = new AnimatedCrushingWheels();
@ -33,7 +33,7 @@ public class CrushingCategory implements IRecipeCategory<CrushingRecipe> {
public CrushingCategory() {
icon = new DoubleItemIcon(() -> new ItemStack(AllBlocks.CRUSHING_WHEEL.get()),
() -> new ItemStack(AllItems.FLOUR.get()));
() -> new ItemStack(AllItems.CRUSHED_GOLD.get()));
}
@Override
@ -47,8 +47,8 @@ public class CrushingCategory implements IRecipeCategory<CrushingRecipe> {
}
@Override
public Class<? extends CrushingRecipe> getRecipeClass() {
return CrushingRecipe.class;
public Class<? extends AbstractCrushingRecipe> getRecipeClass() {
return AbstractCrushingRecipe.class;
}
@Override
@ -62,13 +62,13 @@ public class CrushingCategory implements IRecipeCategory<CrushingRecipe> {
}
@Override
public void setIngredients(CrushingRecipe recipe, IIngredients ingredients) {
public void setIngredients(AbstractCrushingRecipe recipe, IIngredients ingredients) {
ingredients.setInputIngredients(recipe.getIngredients());
ingredients.setOutputs(VanillaTypes.ITEM, recipe.getPossibleOutputs());
}
@Override
public void setRecipe(IRecipeLayout recipeLayout, CrushingRecipe recipe, IIngredients ingredients) {
public void setRecipe(IRecipeLayout recipeLayout, AbstractCrushingRecipe recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
itemStacks.init(0, true, 50, 2);
itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks()));
@ -85,7 +85,7 @@ public class CrushingCategory implements IRecipeCategory<CrushingRecipe> {
}
@Override
public void draw(CrushingRecipe recipe, double mouseX, double mouseY) {
public void draw(AbstractCrushingRecipe recipe, double mouseX, double mouseY) {
List<ProcessingOutput> results = recipe.getRollableResults();
ScreenResources.JEI_SLOT.draw(50, 2);
ScreenResources.JEI_DOWN_ARROW.draw(72, 7);

View file

@ -0,0 +1,111 @@
package com.simibubi.create.compat.jei.category;
import java.util.Arrays;
import java.util.List;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import com.simibubi.create.Create;
import com.simibubi.create.ScreenResources;
import com.simibubi.create.compat.jei.CreateJEI;
import com.simibubi.create.compat.jei.DoubleItemIcon;
import com.simibubi.create.compat.jei.EmptyBackground;
import com.simibubi.create.compat.jei.category.animations.AnimatedMillstone;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.components.crusher.AbstractCrushingRecipe;
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.drawable.IDrawable;
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
import mezz.jei.api.ingredients.IIngredients;
import mezz.jei.api.recipe.category.IRecipeCategory;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class MillingCategory implements IRecipeCategory<AbstractCrushingRecipe> {
private static ResourceLocation ID = new ResourceLocation(Create.ID, "milling");
private AnimatedMillstone millstone = new AnimatedMillstone();
private IDrawable icon;
private IDrawable background = new EmptyBackground(177, 53);
public MillingCategory() {
icon = new DoubleItemIcon(() -> new ItemStack(AllBlocks.MILLSTONE.get()),
() -> new ItemStack(AllItems.FLOUR.get()));
}
@Override
public IDrawable getBackground() {
return background;
}
@Override
public ResourceLocation getUid() {
return ID;
}
@Override
public Class<? extends AbstractCrushingRecipe> getRecipeClass() {
return AbstractCrushingRecipe.class;
}
@Override
public String getTitle() {
return Lang.translate("recipe.milling");
}
@Override
public IDrawable getIcon() {
return icon;
}
@Override
public void setIngredients(AbstractCrushingRecipe recipe, IIngredients ingredients) {
ingredients.setInputIngredients(recipe.getIngredients());
ingredients.setOutputs(VanillaTypes.ITEM, recipe.getPossibleOutputs());
}
@Override
public void setRecipe(IRecipeLayout recipeLayout, AbstractCrushingRecipe recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
itemStacks.init(0, true, 14, 8);
itemStacks.set(0, Arrays.asList(recipe.getIngredients().get(0).getMatchingStacks()));
List<ProcessingOutput> results = recipe.getRollableResults();
boolean single = results.size() == 1;
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
int xOffset = outputIndex % 2 == 0 ? 0 : 19;
int yOffset = (outputIndex / 2) * -19;
itemStacks.init(outputIndex + 1, false, single ? 139 : 133 + xOffset, 27 + yOffset);
itemStacks.set(outputIndex + 1, results.get(outputIndex).getStack());
}
CreateJEI.addStochasticTooltip(itemStacks, results);
}
@Override
public void draw(AbstractCrushingRecipe recipe, double mouseX, double mouseY) {
int size = recipe.getPossibleOutputs().size();
ScreenResources.JEI_SLOT.draw(14, 8);
ScreenResources.JEI_SHADOW.draw(30, 40);
ScreenResources.JEI_ARROW.draw(85, 32);
ScreenResources.JEI_DOWN_ARROW.draw(43, 4);
if (size > 1) {
for (int i = 0; i < size; i++) {
int xOffset = i % 2 == 0 ? 0 : 19;
int yOffset = (i / 2) * -19;
ScreenResources.JEI_SLOT.draw(133 + xOffset, 27 + yOffset);
}
} else {
ScreenResources.JEI_SLOT.draw(139, 27);
}
millstone.draw(57, 27);
}
}

View file

@ -0,0 +1,55 @@
package com.simibubi.create.compat.jei.category.animations;
import com.mojang.blaze3d.platform.GlStateManager;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.gui.ScreenElementRenderer;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.model.IBakedModel;
public class AnimatedMillstone extends AnimatedKinetics {
@Override
public int getWidth() {
return 50;
}
@Override
public int getHeight() {
return 50;
}
@Override
public void draw(int xOffset, int yOffset) {
GlStateManager.pushMatrix();
GlStateManager.enableDepthTest();
GlStateManager.translatef(xOffset, yOffset, 0);
GlStateManager.rotatef(-15.5f, 1, 0, 0);
GlStateManager.rotatef(22.5f, 0, 1, 0);
GlStateManager.translatef(-45, -5, 0);
GlStateManager.scaled(.45f, .45f, .45f);
GlStateManager.pushMatrix();
ScreenElementRenderer.renderModel(this::cogwheel);
GlStateManager.popMatrix();
GlStateManager.pushMatrix();
ScreenElementRenderer.renderBlock(this::body);
GlStateManager.popMatrix();
GlStateManager.popMatrix();
}
private IBakedModel cogwheel() {
float t = 25;
GlStateManager.translatef(t, -t, -t);
GlStateManager.rotated(getCurrentAngle() * 2, 0, 1, 0);
GlStateManager.translatef(-t, t, t);
return AllBlockPartials.MILLSTONE_COG.get();
}
private BlockState body() {
return AllBlocks.MILLSTONE.get().getDefaultState();
}
}

View file

@ -5,6 +5,8 @@ public class CClient extends ConfigBase {
public ConfigGroup client = group(0, "client",
"Client-only settings - If you're looking for general settings, look inside your worlds serverconfig folder!");
public ConfigBool tooltips = b(true, "enableTooltips", "Show item descriptions on Shift and controls on Ctrl.");
public ConfigBool enableOverstressedTooltip =
b(true, "enableOverstressedTooltip", "Display a tooltip when looking at overstressed components.");
public ConfigBool explainRenderErrors =
b(false, "explainRenderErrors", "Log a stack-trace when rendering issues happen within a moving contraption.");
public ConfigFloat fanParticleDensity = f(.5f, 0, 1, "fanParticleDensity");

View file

@ -40,6 +40,7 @@ public class StressConfigDefaults {
case SAW:
case DEPLOYER:
case MECHANICAL_MIXER:
case MILLSTONE:
return 4;
case MECHANICAL_CRAFTER:

View file

@ -1,16 +1,21 @@
package com.simibubi.create.foundation.advancement;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;
import com.google.common.collect.Maps;
import com.simibubi.create.Create;
import net.minecraft.advancements.ICriterionTrigger;
import net.minecraft.advancements.PlayerAdvancements;
import net.minecraft.advancements.criterion.CriterionInstance;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.util.ResourceLocation;
import java.util.*;
import java.util.function.Supplier;
public abstract class CriterionTriggerBase<T extends CriterionTriggerBase.Instance> implements ICriterionTrigger<T> {
public CriterionTriggerBase(String id) {

View file

@ -1,16 +1,17 @@
package com.simibubi.create.foundation.advancement;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject;
import net.minecraft.advancements.criterion.ItemPredicate;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject;
import net.minecraft.advancements.criterion.ItemPredicate;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
public class SandpaperUseTrigger extends CriterionTriggerBase<SandpaperUseTrigger.Instance> {
public SandpaperUseTrigger(String id) {

View file

@ -1,13 +1,14 @@
package com.simibubi.create.foundation.advancement;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.util.ResourceLocation;
import java.util.List;
import java.util.function.Supplier;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject;
import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.util.ResourceLocation;
public class SimpleTrigger extends CriterionTriggerBase<SimpleTrigger.Instance> {
public SimpleTrigger(String id) {

View file

@ -145,7 +145,7 @@ public class FilteringBehaviour extends TileEntityBehaviour {
}
public boolean test(ItemStack stack) {
return filter.isEmpty() || FilterItem.test(stack, filter);
return filter.isEmpty() || FilterItem.test(tileEntity.getWorld(), stack, filter);
}
@Override

View file

@ -0,0 +1,27 @@
package com.simibubi.create.foundation.command;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.simibubi.create.CreateClient;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
public class ClearBufferCacheCommand {
static ArgumentBuilder<CommandSource, ?> register() {
return Commands.literal("clearRenderBuffers").requires(cs -> cs.hasPermissionLevel(0)).executes(ctx -> {
DistExecutor.runWhenOn(Dist.CLIENT, () -> ClearBufferCacheCommand::execute);
ctx.getSource().sendFeedback(new StringTextComponent("Cleared rendering buffers."), true);
return 1;
});
}
@OnlyIn(Dist.CLIENT)
private static void execute() {
CreateClient.bufferCache.invalidate();
}
}

View file

@ -8,7 +8,10 @@ import net.minecraft.command.Commands;
public class CreateCommand {
public CreateCommand(CommandDispatcher<CommandSource> dispatcher) {
// KillTPSCommand.register(dispatcher); Commented out for release
dispatcher.register(Commands.literal("create").then(ToggleDebugCommand.register()));
dispatcher.register(Commands.literal("create")
.then(ToggleDebugCommand.register())
.then(ClearBufferCacheCommand.register())
//.then(KillTPSCommand.register()) //Commented out for release
);
}
}

View file

@ -1,7 +1,7 @@
package com.simibubi.create.foundation.command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.simibubi.create.Create;
import com.simibubi.create.foundation.utility.Lang;
@ -10,8 +10,8 @@ import net.minecraft.command.Commands;
public class KillTPSCommand {
public static void register(CommandDispatcher<CommandSource> dispatcher) {
dispatcher.register(Commands.literal(Lang.translate("command.killTPSCommand"))
public static ArgumentBuilder<CommandSource ,?> register() {
return Commands.literal("killtps")
.requires(cs -> cs.hasPermissionLevel(2)).executes(ctx -> {
// killtps no arguments
ctx.getSource().sendFeedback(
@ -63,6 +63,6 @@ public class KillTPSCommand {
Lang.createTranslationTextComponent("command.killTPSCommand.status.slowed_by.2"), false);
return 1;
})));
}));
}
}

View file

@ -4,6 +4,7 @@ import com.mojang.brigadier.arguments.BoolArgumentType;
import com.mojang.brigadier.builder.ArgumentBuilder;
import com.simibubi.create.AllPackets;
import com.simibubi.create.config.AllConfigs;
import net.minecraft.command.CommandSource;
import net.minecraft.command.Commands;
import net.minecraft.entity.player.ServerPlayerEntity;

View file

@ -1,5 +1,26 @@
package com.simibubi.create.foundation.item;
import static com.simibubi.create.foundation.item.TooltipHelper.cutString;
import static net.minecraft.util.text.TextFormatting.AQUA;
import static net.minecraft.util.text.TextFormatting.BLUE;
import static net.minecraft.util.text.TextFormatting.DARK_GRAY;
import static net.minecraft.util.text.TextFormatting.DARK_GREEN;
import static net.minecraft.util.text.TextFormatting.DARK_PURPLE;
import static net.minecraft.util.text.TextFormatting.DARK_RED;
import static net.minecraft.util.text.TextFormatting.GOLD;
import static net.minecraft.util.text.TextFormatting.GRAY;
import static net.minecraft.util.text.TextFormatting.GREEN;
import static net.minecraft.util.text.TextFormatting.LIGHT_PURPLE;
import static net.minecraft.util.text.TextFormatting.RED;
import static net.minecraft.util.text.TextFormatting.STRIKETHROUGH;
import static net.minecraft.util.text.TextFormatting.WHITE;
import static net.minecraft.util.text.TextFormatting.YELLOW;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import com.simibubi.create.AllItems;
import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.config.CKinetics;
@ -11,6 +32,7 @@ import com.simibubi.create.modules.contraptions.components.fan.EncasedFanBlock;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.EngineBlock;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.FurnaceEngineBlock;
import com.simibubi.create.modules.contraptions.components.waterwheel.WaterWheelBlock;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.Screen;
@ -21,14 +43,6 @@ import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.common.ForgeConfigSpec.ConfigValue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import static com.simibubi.create.foundation.item.TooltipHelper.cutString;
import static net.minecraft.util.text.TextFormatting.*;
public class ItemDescription {
public static final ItemDescription MISSING = new ItemDescription(null);

View file

@ -16,6 +16,7 @@ import com.simibubi.create.modules.contraptions.base.IRotate;
import com.simibubi.create.modules.contraptions.components.flywheel.engine.EngineBlock;
import com.simibubi.create.modules.curiosities.tools.AllToolTiers;
import com.simibubi.create.modules.curiosities.tools.SandPaperItem;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.resources.I18n;
@ -177,6 +178,9 @@ public class TooltipHelper {
}
}
if (stack.getItem() instanceof SandPaperItem)
return "tool.create.sand_paper.tooltip";
return stack.getItem().getTranslationKey(stack) + ".tooltip";
}

View file

@ -29,10 +29,10 @@ public class AllShapes {
SIX_VOXEL_POLE = shape(5, 0, 5, 11, 16, 11).forAxis(),
BELT_FUNNEL = shape(3, -4, 11, 13, 8, 17).forHorizontal(SOUTH),
FUNNEL = shape(1, 1, 13, 15, 15, 17).forDirectional(SOUTH),
EXTRACTOR = shape(4, 2, 11, 12, 10, 17).forDirectional(SOUTH)
.withVerticalShapes(cuboid(4, 11, 4, 12, 17, 12)),
TRANSPOSER = shape(4, 4, -1, 12, 12, 1).add(5, 5, 0, 11, 11, 16).add(4, 4, 11, 12, 12, 17)
.forDirectional(SOUTH),
EXTRACTOR =
shape(4, 2, 11, 12, 10, 17).forDirectional(SOUTH).withVerticalShapes(cuboid(4, 11, 4, 12, 17, 12)),
TRANSPOSER =
shape(4, 4, -1, 12, 12, 1).add(5, 5, 0, 11, 11, 16).add(4, 4, 11, 12, 12, 17).forDirectional(SOUTH),
FURNACE_ENGINE = shape(1, 1, 0, 15, 15, 16).add(0, 0, 9, 16, 16, 14).forHorizontal(Direction.SOUTH),
PORTABLE_STORAGE_INTERFACE = shape(0, 0, 0, 16, 12, 16).add(3, 12, 3, 13, 16, 13).forDirectional(),
PULLEY = shape(0, 0, 0, 16, 16, 2).add(1, 1, 2, 15, 15, 14).add(0, 0, 14, 16, 16, 16).forHorizontalAxis(),
@ -57,6 +57,7 @@ public class AllShapes {
BELT_COLLISION_MASK = cuboid(0, 0, 0, 16, 19, 16),
SCHEMATICANNON_SHAPE = shape(1, 0, 1, 15, 8, 15).add(0.5, 8, 0.5, 15.5, 11, 15.5).build(),
PULLEY_MAGNET = shape(3, 0, 3, 13, 2, 13).add(FOUR_VOXEL_POLE.get(UP)).build(),
MILLSTONE = shape(0, 0, 0, 16, 6, 16).add(2, 6, 2, 14, 13, 14).add(3, 13, 3, 13, 16, 13).build(),
GAUGE_SHAPE_UP = shape(1, 0, 0, 15, 2, 16).add(2, 2, 1, 14, 14, 15).build()
;
@ -64,15 +65,16 @@ public class AllShapes {
// Internally Shared Shapes
private static final VoxelShape
PISTON_HEAD = Blocks.PISTON_HEAD.getDefaultState().with(DirectionalBlock.FACING, UP)
.with(PistonHeadBlock.SHORT, true).getShape(null, null),
PISTON_HEAD =
Blocks.PISTON_HEAD.getDefaultState().with(DirectionalBlock.FACING, UP).with(PistonHeadBlock.SHORT, true)
.getShape(null, null),
PISTON_EXTENDED = shape(CASING_12PX.get(UP)).add(FOUR_VOXEL_POLE.get(Axis.Y)).build(),
SMALL_GEAR_SHAPE = cuboid(2, 6, 2, 14, 10, 14), LARGE_GEAR_SHAPE = cuboid(0, 6, 0, 16, 10, 16),
VERTICAL_TABLET_SHAPE = cuboid(3, 1, -1, 13, 15, 3), SQUARE_TABLET_SHAPE = cuboid(2, 2, -1, 14, 14, 3),
LOGISTICS_TABLE_SLOPE = shape(0, 10, 15, 16, 14, 10.667).add(0, 12, 10.667, 16, 16, 6.333)
.add(0, 14, 6.333, 16, 18, 2).build(),
SCHEMATICS_TABLE_SLOPE = shape(0, 10, 16, 16, 14, 11).add(0, 12, 11, 16, 16, 6).add(0, 14, 6, 16, 18, 1)
.build()
LOGISTICS_TABLE_SLOPE =
shape(0, 10, 15, 16, 14, 10.667).add(0, 12, 10.667, 16, 16, 6.333).add(0, 14, 6.333, 16, 18, 2).build(),
SCHEMATICS_TABLE_SLOPE =
shape(0, 10, 16, 16, 14, 11).add(0, 12, 11, 16, 16, 6).add(0, 14, 6, 16, 18, 1).build()
;
@ -84,8 +86,8 @@ public class AllShapes {
SMALL_GEAR = shape(SMALL_GEAR_SHAPE).add(SIX_VOXEL_POLE.get(Axis.Y)).forAxis(),
LARGE_GEAR = shape(LARGE_GEAR_SHAPE).add(SIX_VOXEL_POLE.get(Axis.Y)).forAxis(),
LOGISTICAL_CONTROLLER = shape(SQUARE_TABLET_SHAPE).forDirectional(SOUTH),
REDSTONE_BRIDGE = shape(VERTICAL_TABLET_SHAPE).forDirectional(SOUTH)
.withVerticalShapes(LOGISTICAL_CONTROLLER.get(UP)),
REDSTONE_BRIDGE =
shape(VERTICAL_TABLET_SHAPE).forDirectional(SOUTH).withVerticalShapes(LOGISTICAL_CONTROLLER.get(UP)),
LOGISTICS_TABLE = shape(TABLE_POLE_SHAPE).add(LOGISTICS_TABLE_SLOPE).forHorizontal(SOUTH),
SCHEMATICS_TABLE = shape(TABLE_POLE_SHAPE).add(SCHEMATICS_TABLE_SLOPE).forDirectional(SOUTH)
@ -120,8 +122,8 @@ public class AllShapes {
}
Builder erase(double x1, double y1, double z1, double x2, double y2, double z2) {
this.shape = VoxelShapes.combineAndSimplify(shape, cuboid(x1, y1, z1, x2, y2, z2),
IBooleanFunction.ONLY_FIRST);
this.shape =
VoxelShapes.combineAndSimplify(shape, cuboid(x1, y1, z1, x2, y2, z2), IBooleanFunction.ONLY_FIRST);
return this;
}

View file

@ -0,0 +1,52 @@
package com.simibubi.create.foundation.utility.data;
import com.simibubi.create.AllBlocks;
import net.minecraft.block.Block;
import net.minecraft.data.BlockTagsProvider;
import net.minecraft.data.DataGenerator;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.Tag;
import net.minecraft.util.ResourceLocation;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class AllBlocksTagProvider extends BlockTagsProvider {
static Map<ResourceLocation, BlockTags.Wrapper> createdTags;
protected AllBlocksTagProvider(DataGenerator generatorIn) {
super(generatorIn);
}
@Override
protected void registerTags() {
createdTags = new HashMap<>();
for (AllBlocks entry :
AllBlocks.values()) {
entry.getTaggable().getTagSet(ITaggable.TagType.BLOCK).forEach(resLoc -> {
if (resLoc.getNamespace().equals("forge") && resLoc.getPath().contains("/"))
builder(new ResourceLocation(resLoc.getNamespace(), resLoc.getPath().split("/")[0])).add(new Tag<>(resLoc));
builder(resLoc).add(entry.get());
});
if (entry.alsoRegistered == null)
continue;
Arrays.stream(entry.alsoRegistered).forEach(
taggedBlock -> taggedBlock.getTagSet(ITaggable.TagType.BLOCK).forEach(
resLoc -> builder(resLoc).add(taggedBlock.getBlock())));
}
}
private Tag.Builder<Block> builder(ResourceLocation resLoc) {
return this.getBuilder(createdTags.computeIfAbsent(resLoc, BlockTags.Wrapper::new));
}
@Override
public String getName() {
return "Create Block Tags";
}
}

View file

@ -0,0 +1,65 @@
package com.simibubi.create.foundation.utility.data;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.AllItems;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.ItemTagsProvider;
import net.minecraft.item.Item;
import net.minecraft.tags.ItemTags;
import net.minecraft.tags.Tag;
import net.minecraft.util.ResourceLocation;
public class AllItemsTagProvider extends ItemTagsProvider {
static Map<ResourceLocation, ItemTags.Wrapper> createdTags;
protected AllItemsTagProvider(DataGenerator generatorIn) {
super(generatorIn);
}
@Override
protected void registerTags() {
createdTags = new HashMap<>();
//first create all tags for AllBlocks as ItemBlocks
for (AllBlocks entry :
AllBlocks.values()) {
entry.getTaggable().getTagSet(ITaggable.TagType.ITEM).forEach(resLoc -> {
if (resLoc.getNamespace().equals("forge") && resLoc.getPath().contains("/"))
builder(new ResourceLocation(resLoc.getNamespace(), resLoc.getPath().split("/")[0])).add(new Tag<>(resLoc));
builder(resLoc).add(entry.get().asItem());
});
if (entry.alsoRegistered == null)
continue;
Arrays.stream(entry.alsoRegistered).forEach(
taggedBlock -> taggedBlock.getTagSet(ITaggable.TagType.ITEM).forEach(
resLoc -> builder(resLoc).add(taggedBlock.getBlock().asItem())));
}
//now do the same for AllItems
for (AllItems entry :
AllItems.values()){
entry.getTaggable().getTagSet(ITaggable.TagType.ITEM).forEach(resLoc -> {
if (resLoc.getNamespace().equals("forge") && resLoc.getPath().contains("/"))
builder(new ResourceLocation(resLoc.getNamespace(), resLoc.getPath().split("/")[0])).add(new Tag<>(resLoc));
builder(resLoc).add(entry.get().asItem());
});
}
}
private Tag.Builder<Item> builder(ResourceLocation resLoc) {
return this.getBuilder(createdTags.computeIfAbsent(resLoc, ItemTags.Wrapper::new));
}
@Override
public String getName() {
return "Create Item Tags";
}
}

View file

@ -1,35 +1,19 @@
package com.simibubi.create.foundation.utility.data;
import com.simibubi.create.AllSoundEvents;
import net.minecraft.data.DirectoryCache;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import net.minecraft.data.DataGenerator;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.GatherDataEvent;
@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public class Generator {
/*
* this can probably be called by some gradle task or so but im not know how, so for now i just added a main below and execute from there when we need to generate jsons
**/
public static void generateJsonFiles(){
Path base = Paths.get("src/main/resources");
DirectoryCache cache;
try {
cache = new DirectoryCache(base, "cache");
for (ICanGenerateJson gen:
new ICanGenerateJson[]{AllSoundEvents.CUCKOO_CREEPER}) {
gen.generate(base, cache);
}
} catch (IOException e) {
e.printStackTrace();
}
@SubscribeEvent
public static void gatherData(GatherDataEvent event){
DataGenerator gen = event.getGenerator();
//gen.addProvider(AllSoundEvents.CUCKOO_PIG);
gen.addProvider(new AllBlocksTagProvider(gen));
gen.addProvider(new AllItemsTagProvider(gen));
}
public static void main(String[] args) {
generateJsonFiles();
}
}

View file

@ -1,11 +0,0 @@
package com.simibubi.create.foundation.utility.data;
import net.minecraft.data.DirectoryCache;
import java.nio.file.Path;
public interface ICanGenerateJson {
//path points to the resource1s base folder
void generate(Path path, DirectoryCache cache);
}

View file

@ -0,0 +1,51 @@
package com.simibubi.create.foundation.utility.data;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import net.minecraft.util.ResourceLocation;
public interface ITaggable<T extends ITaggable<T>> {
enum TagType {
BLOCK, ITEM
}
default T withTags(ResourceLocation... tagsIn) {
return this.withTags(TagType.BLOCK, tagsIn).withTags(TagType.ITEM, tagsIn);
}
@SuppressWarnings("unchecked")
default T withTags(TagType type, ResourceLocation... tagsIn) {
Collections.addAll(getTagSet(type), tagsIn);
return (T) this;
}
default T withTagsInNamespace(String namespace, String... tagsIn) {
return withTags(Arrays.stream(tagsIn).map(s -> new ResourceLocation(namespace, s)).toArray(ResourceLocation[]::new));
}
default T withTagsInNamespace(TagType type, String namespace, String... tagsIn) {
return withTags(type, Arrays.stream(tagsIn).map(s -> new ResourceLocation(namespace, s)).toArray(ResourceLocation[]::new));
}
default T withCreateTags(String... tagsIn) {
return withTagsInNamespace("create", tagsIn);
}
default T withForgeTags(String... tagsIn) {
return withTagsInNamespace("forge", tagsIn);
}
default T withVanillaTags(String... tagsIn) {
return withTagsInNamespace("minecraft", tagsIn);
}
default T withVanillaTags(TagType type, String... tagsIn) {
return withTagsInNamespace(type, "minecraft", tagsIn);
}
//take a look at AllBlocks.TaggedBlock for more info
Set<ResourceLocation> getTagSet(TagType type);
}

View file

@ -19,9 +19,9 @@ public enum AllWorldFeatures {
COPPER_ORE_OCEAN(
new CountedOreFeature(AllBlocks.COPPER_ORE.get(), 15, 4).between(20, 55).inBiomes(Biome.Category.OCEAN)),
ZINC_ORE(new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 17, 1).between(55, 80)),
ZINC_ORE(new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 8, 1).between(55, 80)),
ZINC_ORE_DESERT(
new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 17, 5).between(50, 85).inBiomes(Biome.Category.DESERT)),
new CountedOreFeature(AllBlocks.ZINC_ORE.get(), 10, 5).between(50, 85).inBiomes(Biome.Category.DESERT)),
LIMESTONE(new ChanceOreFeature(AllBlocks.LIMESTONE.get(), 128, 1 / 32f).between(30, 70)),
WEATHERED_LIMESTONE(new ChanceOreFeature(AllBlocks.WEATHERED_LIMESTONE.get(), 128, 1 / 32f).between(10, 30)),
@ -55,6 +55,24 @@ public enum AllWorldFeatures {
biome.addFeature(entry.feature.getGenerationStage(), createFeature.get());
}
}
// // Debug contained ore features
// for (Biome biome : ForgeRegistries.BIOMES) {
// Debug.markTemporary();
// System.out.println(biome.getRegistryName().getPath() + " has the following features:");
// for (ConfiguredFeature<?> configuredFeature : biome.getFeatures(Decoration.UNDERGROUND_ORES)) {
// IFeatureConfig config = configuredFeature.config;
// if (!(config instanceof DecoratedFeatureConfig))
// continue;
// DecoratedFeatureConfig decoConf = (DecoratedFeatureConfig) config;
// if (!(decoConf.feature.config instanceof OreFeatureConfig))
// continue;
// OreFeatureConfig oreConf = (OreFeatureConfig) decoConf.feature.config;
// System.out.println(configuredFeature.feature.getRegistryName().getPath());
// System.out.println(oreConf.state.getBlock().getRegistryName().getPath());
// System.out.println("--");
// }
// }
}
public static void fillConfig(ForgeConfigSpec.Builder builder) {

View file

@ -28,7 +28,7 @@ public abstract class OreFeature<T extends IPlacementConfig> extends ConfigBase
protected ConfigInt maxHeight;
private Block block;
private Biome.Category biomeWhitelist;
private Biome.Category specificCategory;
public OreFeature(Block block, int clusterSize) {
this.block = block;
@ -47,7 +47,7 @@ public abstract class OreFeature<T extends IPlacementConfig> extends ConfigBase
}
public OreFeature<T> inBiomes(Biome.Category category) {
biomeWhitelist = category;
specificCategory = category;
return this;
}
@ -58,7 +58,7 @@ public abstract class OreFeature<T extends IPlacementConfig> extends ConfigBase
@Override
public Optional<ConfiguredFeature<?>> createFeature(Biome biome) {
if (biomeWhitelist != null && biome.getCategory() == biomeWhitelist)
if (specificCategory != null && biome.getCategory() != specificCategory)
return Optional.empty();
if (!canGenerate())
return Optional.empty();

View file

@ -61,7 +61,7 @@ public class KineticNetwork {
if (te.isSource())
sources.put(te, te.getAddedStressCapacity());
members.put(te, te.getStressApplied());
te.updateStressFromNetwork(currentCapacity, currentStress);
te.updateFromNetwork(currentCapacity, currentStress, getSize());
te.networkDirty = true;
}
@ -81,7 +81,7 @@ public class KineticNetwork {
if (te.isSource())
sources.remove(te);
members.remove(te);
te.updateStressFromNetwork(0, 0);
te.updateFromNetwork(0, 0, 0);
if (members.isEmpty()) {
TorquePropagator.networks.get(te.getWorld()).remove(this.id);
@ -93,7 +93,7 @@ public class KineticNetwork {
public void sync() {
for (KineticTileEntity te : members.keySet())
te.updateStressFromNetwork(currentCapacity, currentStress);
te.updateFromNetwork(currentCapacity, currentStress, getSize());
}
public void updateCapacity() {

View file

@ -1,7 +1,6 @@
package com.simibubi.create.modules.contraptions;
import static com.simibubi.create.AllBlocks.BELT;
import static com.simibubi.create.AllBlocks.COGWHEEL;
import static com.simibubi.create.AllBlocks.LARGE_COGWHEEL;
import static net.minecraft.state.properties.BlockStateProperties.AXIS;
@ -20,6 +19,7 @@ import com.simibubi.create.modules.contraptions.relays.encased.SplitShaftTileEnt
import com.simibubi.create.modules.contraptions.relays.gearbox.GearboxTileEntity;
import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.BlockPos;
@ -57,8 +57,8 @@ public class RotationPropagator {
alignedAxes && definitionFrom.hasShaftTowards(world, from.getPos(), stateFrom, direction)
&& definitionTo.hasShaftTowards(world, to.getPos(), stateTo, direction.getOpposite());
boolean connectedByGears = definitionFrom.hasCogsTowards(world, from.getPos(), stateFrom, direction)
&& definitionTo.hasCogsTowards(world, to.getPos(), stateTo, direction.getOpposite());
boolean connectedByGears = definitionFrom.hasIntegratedCogwheel(world, from.getPos(), stateFrom)
&& definitionTo.hasIntegratedCogwheel(world, to.getPos(), stateTo);
// Belt <-> Belt
if (from instanceof BeltTileEntity && to instanceof BeltTileEntity && !connectedByAxis) {
@ -90,16 +90,12 @@ public class RotationPropagator {
}
// Gear <-> Large Gear
if (isLargeToSmallGear(stateFrom, stateTo, diff))
return -2f;
if (isLargeToSmallGear(stateTo, stateFrom, diff))
return -.5f;
// Rotation Speed Controller <-> Large Gear
if (isLargeGearToSpeedController(stateFrom, stateTo, diff))
return SpeedControllerTileEntity.getSpeedModifier(from, to, true);
if (isLargeGearToSpeedController(stateTo, stateFrom, diff))
return SpeedControllerTileEntity.getSpeedModifier(to, from, false);
if (LARGE_COGWHEEL.typeOf(stateFrom) && definitionTo.hasIntegratedCogwheel(world, to.getPos(), stateTo))
if (isLargeToSmallGear(stateFrom, stateTo, definitionTo, diff))
return -2f;
if (LARGE_COGWHEEL.typeOf(stateTo) && definitionFrom.hasIntegratedCogwheel(world, from.getPos(), stateFrom))
if (isLargeToSmallGear(stateTo, stateFrom, definitionFrom, diff))
return -.5f;
// Gear <-> Gear
if (connectedByGears) {
@ -107,6 +103,8 @@ public class RotationPropagator {
return 0;
if (LARGE_COGWHEEL.typeOf(stateTo))
return 0;
if (direction.getAxis() == definitionFrom.getRotationAxis(stateFrom))
return 0;
if (definitionFrom.getRotationAxis(stateFrom) == definitionTo.getRotationAxis(stateTo))
return -1;
}
@ -114,6 +112,21 @@ public class RotationPropagator {
return 0;
}
private static float getConveyedSpeed(KineticTileEntity from, KineticTileEntity to) {
final BlockState stateFrom = from.getBlockState();
final BlockState stateTo = to.getBlockState();
final BlockPos diff = to.getPos().subtract(from.getPos());
// Rotation Speed Controller <-> Large Gear
if (isLargeGearToSpeedController(stateFrom, stateTo, diff))
return SpeedControllerTileEntity.getConveyedSpeed(from, to, true);
if (isLargeGearToSpeedController(stateTo, stateFrom, diff))
return SpeedControllerTileEntity.getConveyedSpeed(to, from, false);
float rotationSpeedModifier = getRotationSpeedModifier(from, to);
return from.getTheoreticalSpeed() * rotationSpeedModifier;
}
private static boolean isLargeToLargeGear(BlockState from, BlockState to, BlockPos diff) {
if (!LARGE_COGWHEEL.typeOf(from) || !LARGE_COGWHEEL.typeOf(to))
return false;
@ -148,11 +161,9 @@ public class RotationPropagator {
return 1;
}
private static boolean isLargeToSmallGear(BlockState from, BlockState to, BlockPos diff) {
if (!LARGE_COGWHEEL.typeOf(from) || !COGWHEEL.typeOf(to))
return false;
private static boolean isLargeToSmallGear(BlockState from, BlockState to, IRotate defTo, BlockPos diff) {
Axis axisFrom = from.get(AXIS);
if (axisFrom != to.get(AXIS))
if (axisFrom != defTo.getRotationAxis(to))
return false;
if (axisFrom.getCoordinate(diff.getX(), diff.getY(), diff.getZ()) != 0)
return false;
@ -184,31 +195,7 @@ public class RotationPropagator {
return;
if (!worldIn.isBlockPresent(pos))
return;
if (addedTE.getTheoreticalSpeed() != 0) {
propagateNewSource(addedTE);
return;
}
for (KineticTileEntity neighbourTE : getConnectedNeighbours(addedTE)) {
final float speedModifier = getRotationSpeedModifier(neighbourTE, addedTE);
float neighbourSpeed = neighbourTE.getTheoreticalSpeed();
if (neighbourSpeed == 0)
continue;
if (neighbourTE.hasSource() && neighbourTE.source.equals(addedTE.getPos())) {
addedTE.setSpeed(neighbourSpeed * speedModifier);
addedTE.onSpeedChanged(0);
addedTE.sendData();
continue;
}
addedTE.setSpeed(neighbourSpeed * speedModifier);
addedTE.setSource(neighbourTE.getPos());
addedTE.onSpeedChanged(0);
addedTE.sendData();
propagateNewSource(addedTE);
return;
}
propagateNewSource(addedTE);
}
/**
@ -221,12 +208,10 @@ public class RotationPropagator {
World world = currentTE.getWorld();
for (KineticTileEntity neighbourTE : getConnectedNeighbours(currentTE)) {
float modFromTo = getRotationSpeedModifier(currentTE, neighbourTE);
float modToFrom = getRotationSpeedModifier(neighbourTE, currentTE);
float speedOfCurrent = currentTE.getTheoreticalSpeed();
float speedOfNeighbour = neighbourTE.getTheoreticalSpeed();
float newSpeed = speedOfCurrent * modFromTo;
float oppositeSpeed = speedOfNeighbour * modToFrom;
float newSpeed = getConveyedSpeed(currentTE, neighbourTE);
float oppositeSpeed = getConveyedSpeed(neighbourTE, currentTE);
boolean incompatible =
Math.signum(newSpeed) != Math.signum(speedOfNeighbour) && (newSpeed != 0 && speedOfNeighbour != 0);
@ -249,8 +234,8 @@ public class RotationPropagator {
// Neighbour faster, overpower the incoming tree
if (Math.abs(oppositeSpeed) > Math.abs(speedOfCurrent)) {
float prevSpeed = currentTE.getSpeed();
currentTE.setSpeed(speedOfNeighbour * getRotationSpeedModifier(neighbourTE, currentTE));
currentTE.setSource(neighbourTE.getPos());
currentTE.setSpeed(getConveyedSpeed(neighbourTE, currentTE));
currentTE.onSpeedChanged(prevSpeed);
currentTE.sendData();
@ -272,8 +257,8 @@ public class RotationPropagator {
currentTE.removeSource();
float prevSpeed = neighbourTE.getSpeed();
neighbourTE.setSpeed(speedOfCurrent * getRotationSpeedModifier(currentTE, neighbourTE));
neighbourTE.setSource(currentTE.getPos());
neighbourTE.setSpeed(getConveyedSpeed(currentTE, neighbourTE));
neighbourTE.onSpeedChanged(prevSpeed);
neighbourTE.sendData();
propagateNewSource(neighbourTE);
@ -313,8 +298,11 @@ public class RotationPropagator {
BlockState neighbourState = worldIn.getBlockState(neighbourPos);
if (!(neighbourState.getBlock() instanceof IRotate))
continue;
final KineticTileEntity neighbourTE = (KineticTileEntity) worldIn.getTileEntity(neighbourPos);
TileEntity tileEntity = worldIn.getTileEntity(neighbourPos);
if (!(tileEntity instanceof KineticTileEntity))
continue;
final KineticTileEntity neighbourTE = (KineticTileEntity) tileEntity;
if (!neighbourTE.hasSource() || !neighbourTE.source.equals(pos))
continue;
@ -370,17 +358,33 @@ public class RotationPropagator {
}
}
private static KineticTileEntity findConnectedNeighbour(KineticTileEntity te, BlockPos neighbourPos) {
BlockState neighbourState = te.getWorld().getBlockState(neighbourPos);
private static KineticTileEntity findConnectedNeighbour(KineticTileEntity currentTE, BlockPos neighbourPos) {
BlockState neighbourState = currentTE.getWorld().getBlockState(neighbourPos);
if (!(neighbourState.getBlock() instanceof IRotate))
return null;
if (!neighbourState.hasTileEntity())
return null;
KineticTileEntity neighbour = (KineticTileEntity) te.getWorld().getTileEntity(neighbourPos);
if (getRotationSpeedModifier(te, neighbour) == 0)
TileEntity neighbourTE = currentTE.getWorld().getTileEntity(neighbourPos);
if (!(neighbourTE instanceof KineticTileEntity))
return null;
return neighbour;
KineticTileEntity neighbourKTE = (KineticTileEntity) neighbourTE;
if (!(neighbourKTE.getBlockState().getBlock() instanceof IRotate))
return null;
if (!isConnected(currentTE, neighbourKTE))
return null;
return neighbourKTE;
}
public static boolean isConnected(KineticTileEntity from, KineticTileEntity to) {
final BlockState stateFrom = from.getBlockState();
final BlockState stateTo = to.getBlockState();
final BlockPos diff = to.getPos().subtract(from.getPos());
if (isLargeGearToSpeedController(stateFrom, stateTo, diff))
return true;
if (isLargeGearToSpeedController(stateTo, stateFrom, diff))
return true;
return getRotationSpeedModifier(from, to) != 0;
}
private static List<KineticTileEntity> getConnectedNeighbours(KineticTileEntity te) {
@ -408,8 +412,13 @@ public class RotationPropagator {
BlockState blockState = te.getBlockState();
boolean isLargeWheel = LARGE_COGWHEEL.typeOf(blockState);
if (COGWHEEL.typeOf(blockState) || isLargeWheel || BELT.typeOf(blockState)) {
Axis axis = ((IRotate) blockState.getBlock()).getRotationAxis(blockState);
if (!(blockState.getBlock() instanceof IRotate))
return neighbours;
IRotate block = (IRotate) blockState.getBlock();
if (block.hasIntegratedCogwheel(te.getWorld(), te.getPos(), blockState) || isLargeWheel
|| BELT.typeOf(blockState)) {
Axis axis = block.getRotationAxis(blockState);
BlockPos.getAllInBox(new BlockPos(-1, -1, -1), new BlockPos(1, 1, 1)).forEach(offset -> {
if (!isLargeWheel && axis.getCoordinate(offset.getX(), offset.getY(), offset.getZ()) != 0)

View file

@ -39,9 +39,10 @@ public class WrenchItem extends Item implements IHaveCustomItemModel {
if (player.isSneaking()) {
if (world instanceof ServerWorld) {
if (!player.isCreative())
Block.getDrops(state, (ServerWorld) world, pos, world.getTileEntity(pos)).forEach(itemStack -> {
player.inventory.placeItemBackInInventory(world, itemStack);
});
Block.getDrops(state, (ServerWorld) world, pos, world.getTileEntity(pos), player, context.getItem())
.forEach(itemStack -> {
player.inventory.placeItemBackInInventory(world, itemStack);
});
state.spawnAdditionalDrops(world, pos, ItemStack.EMPTY);
world.destroyBlock(pos, false);
}

View file

@ -8,8 +8,8 @@ import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Direction;
import net.minecraft.util.Rotation;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;

View file

@ -1,16 +1,16 @@
package com.simibubi.create.modules.contraptions.base;
import java.util.List;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.KineticNetwork;
import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel;
import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextFormatting;
import java.util.List;
public abstract class GeneratingKineticTileEntity extends KineticTileEntity {
public boolean reActivateSource;

View file

@ -4,8 +4,8 @@ import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.foundation.item.ItemDescription;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.IWrenchable;
import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation;
import net.minecraft.block.BlockState;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
@ -68,9 +68,9 @@ public interface IRotate extends IWrenchable {
String level = color + ItemDescription.makeProgressBar(3, speedLevel.ordinal());
if (speedLevel == SpeedLevel.MEDIUM)
level += Lang.translate("tooltip.speedRequirements.medium");
level += Lang.translate("tooltip.speedRequirement.medium");
if (speedLevel == SpeedLevel.FAST)
level += Lang.translate("tooltip.speedRequirements.high");
level += Lang.translate("tooltip.speedRequirement.high");
level += String.format(" (%s%s) ", IHaveGoggleInformation.format(Math.abs(speed)), Lang.translate("generic.unit.rpm"));
@ -118,8 +118,8 @@ public interface IRotate extends IWrenchable {
}
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face);
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face);
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state);
public Axis getRotationAxis(BlockState state);

View file

@ -55,7 +55,7 @@ public abstract class KineticBlock extends Block implements IRotate {
}
@Override
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return false;
}

View file

@ -1,5 +1,8 @@
package com.simibubi.create.modules.contraptions.base;
import static net.minecraft.util.text.TextFormatting.GOLD;
import static net.minecraft.util.text.TextFormatting.GRAY;
import java.util.List;
import java.util.Map;
@ -16,8 +19,9 @@ import com.simibubi.create.modules.contraptions.KineticNetwork;
import com.simibubi.create.modules.contraptions.RotationPropagator;
import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel;
import com.simibubi.create.modules.contraptions.base.IRotate.StressImpact;
import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation;
import com.simibubi.create.modules.contraptions.goggle.IHaveHoveringInformation;
import net.minecraft.block.BlockState;
import net.minecraft.client.resources.I18n;
import net.minecraft.nbt.CompoundNBT;
@ -31,9 +35,8 @@ import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeConfigSpec.ConfigValue;
import static net.minecraft.util.text.TextFormatting.GRAY;
public abstract class KineticTileEntity extends SmartTileEntity implements ITickableTileEntity, IHaveGoggleInformation {
public abstract class KineticTileEntity extends SmartTileEntity
implements ITickableTileEntity, IHaveGoggleInformation, IHaveHoveringInformation {
public @Nullable Long network;
public @Nullable BlockPos source;
@ -117,10 +120,11 @@ public abstract class KineticTileEntity extends SmartTileEntity implements ITick
}
}
public void updateStressFromNetwork(float maxStress, float currentStress) {
public void updateFromNetwork(float maxStress, float currentStress, int networkSize) {
networkDirty = false;
this.capacity = maxStress;
this.stress = currentStress;
this.networkSize = networkSize;
boolean overStressed = maxStress < currentStress && StressImpact.isEnabled();
if (overStressed != this.overStressed) {
@ -179,7 +183,7 @@ public abstract class KineticTileEntity extends SmartTileEntity implements ITick
networkTag.putLong("Id", this.network);
networkTag.putFloat("Stress", stress);
networkTag.putFloat("Capacity", capacity);
networkTag.putInt("Size", getOrCreateNetwork().getSize());
networkTag.putInt("Size", networkSize);
float stressApplied = getStressApplied();
float addedStressCapacity = getAddedStressCapacity();
@ -353,28 +357,51 @@ public abstract class KineticTileEntity extends SmartTileEntity implements ITick
return true;
}
@Override
public boolean addToTooltip(List<String> tooltip, boolean isPlayerSneaking) {
boolean notFastEnough = !isSpeedRequirementFulfilled() && getSpeed() != 0;
if (overStressed && AllConfigs.CLIENT.enableOverstressedTooltip.get()) {
tooltip.add(spacing + GOLD + Lang.translate("gui.stress_gauge.overstressed"));
String hint = Lang.translate("gui.contraptions.network_overstressed",
I18n.format(getBlockState().getBlock().getTranslationKey()));
List<String> cutString = TooltipHelper.cutString(spacing + hint, GRAY, TextFormatting.WHITE);
for (int i = 0; i < cutString.size(); i++)
tooltip.add((i == 0 ? "" : spacing) + cutString.get(i));
return true;
}
if (notFastEnough) {
tooltip.add(spacing + GOLD + Lang.translate("tooltip.speedRequirement"));
String hint = Lang.translate("gui.contraptions.not_fast_enough",
I18n.format(getBlockState().getBlock().getTranslationKey()));
List<String> cutString = TooltipHelper.cutString(spacing + hint, GRAY, TextFormatting.WHITE);
for (int i = 0; i < cutString.size(); i++)
tooltip.add((i == 0 ? "" : spacing) + cutString.get(i));
return true;
}
return false;
}
@Override
public boolean addToGoggleTooltip(List<String> tooltip, boolean isPlayerSneaking) {
boolean added = false;
float stressAtBase = getStressApplied();
boolean notFastEnough = !isSpeedRequirementFulfilled() && getSpeed() != 0;
if (notFastEnough) {
tooltip.addAll(TooltipHelper.cutString(spacing + Lang.translate("gui.contraptions.not_fast_enough", I18n.format(getBlockState().getBlock().getTranslationKey())), GRAY, TextFormatting.WHITE));
added = true;
}
if (getStressApplied() != 0 && StressImpact.isEnabled()){
if (getStressApplied() != 0 && StressImpact.isEnabled()) {
tooltip.add(spacing + Lang.translate("gui.goggles.kinetic_stats"));
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("tooltip.stressImpact"));
float stressTotal = stressAtBase * Math.abs(getSpeed());
String stressString = spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s";
String stressString =
spacing + "%s%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s";
tooltip.add(String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressAtBase), Lang.translate("gui.goggles.base_value")));
tooltip.add(String.format(stressString, TextFormatting.GRAY, IHaveGoggleInformation.format(stressTotal), Lang.translate("gui.goggles.at_current_speed")));
tooltip.add(String.format(stressString, TextFormatting.AQUA, IHaveGoggleInformation.format(stressAtBase),
Lang.translate("gui.goggles.base_value")));
tooltip.add(String.format(stressString, TextFormatting.GRAY, IHaveGoggleInformation.format(stressTotal),
Lang.translate("gui.goggles.at_current_speed")));
added = true;
}

View file

@ -13,6 +13,7 @@ import com.simibubi.create.modules.contraptions.components.contraptions.Movement
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.CropsBlock;
import net.minecraft.block.KelpBlock;
import net.minecraft.block.SugarCaneBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.state.IProperty;
@ -111,6 +112,8 @@ public class HarvesterMovementBehaviour extends MovementBehaviour {
return false;
}
if (state.getBlock() instanceof KelpBlock)
return true;
if (state.getBlock() instanceof IPlantable)
return true;
}
@ -124,7 +127,9 @@ public class HarvesterMovementBehaviour extends MovementBehaviour {
return crop.withAge(0);
}
if (state.getBlock() == Blocks.SUGAR_CANE) {
return Blocks.AIR.getDefaultState();
if (state.getFluidState().isEmpty())
return Blocks.AIR.getDefaultState();
return state.getFluidState().getBlockState();
}
if (state.getCollisionShape(world, pos).isEmpty()) {
for (IProperty<?> property : state.getProperties()) {
@ -136,7 +141,9 @@ public class HarvesterMovementBehaviour extends MovementBehaviour {
}
}
return Blocks.AIR.getDefaultState();
if (state.getFluidState().isEmpty())
return Blocks.AIR.getDefaultState();
return state.getFluidState().getBlockState();
}
}

View file

@ -12,8 +12,8 @@ import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.Direction;
import net.minecraft.util.NonNullList;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;

View file

@ -4,6 +4,10 @@ import com.simibubi.create.AllBlocks;
import com.simibubi.create.modules.contraptions.components.actors.HarvesterBlock;
import com.simibubi.create.modules.contraptions.components.actors.PortableStorageInterfaceBlock;
import com.simibubi.create.modules.contraptions.components.contraptions.chassis.AbstractChassisBlock;
import com.simibubi.create.modules.logistics.block.belts.AttachedLogisticalBlock;
import com.simibubi.create.modules.logistics.block.belts.FunnelBlock;
import com.simibubi.create.modules.logistics.block.extractor.ExtractorBlock;
import com.simibubi.create.modules.logistics.block.transposer.TransposerBlock;
import net.minecraft.block.AbstractPressurePlateBlock;
import net.minecraft.block.AbstractRailBlock;
@ -11,6 +15,7 @@ import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.DoorBlock;
import net.minecraft.block.FenceGateBlock;
import net.minecraft.block.FlowerPotBlock;
import net.minecraft.block.HorizontalFaceBlock;
import net.minecraft.block.LadderBlock;
@ -32,6 +37,8 @@ public class BlockMovementTraits {
BlockState state = world.getBlockState(pos);
if (isBrittle(state))
return true;
if (state.getBlock() instanceof FenceGateBlock)
return true;
if (state.getMaterial().isReplaceable())
return false;
if (state.getCollisionShape(world, pos).isEmpty())
@ -41,14 +48,19 @@ public class BlockMovementTraits {
public static boolean movementAllowed(World world, BlockPos pos) {
BlockState blockState = world.getBlockState(pos);
if (blockState.getBlock() instanceof AbstractChassisBlock)
Block block = blockState.getBlock();
if (block instanceof AbstractChassisBlock)
return true;
if (blockState.getBlockHardness(world, pos) == -1)
return false;
if (blockState.getBlock() == Blocks.OBSIDIAN)
if (block == Blocks.OBSIDIAN)
return false;
if (AllBlocks.BELT.typeOf(blockState))
return true;
if (block instanceof ExtractorBlock)
return true;
if (block instanceof FunnelBlock)
return true;
return blockState.getPushReaction() != PushReaction.BLOCK;
}
@ -62,6 +74,10 @@ public class BlockMovementTraits {
return true;
if (block instanceof LadderBlock)
return true;
if (block instanceof ExtractorBlock)
return true;
if (block instanceof FunnelBlock)
return true;
if (block instanceof TorchBlock)
return true;
if (block instanceof FlowerPotBlock)
@ -94,6 +110,8 @@ public class BlockMovementTraits {
return direction == Direction.DOWN;
if (block instanceof DoorBlock)
return direction == Direction.DOWN;
if (block instanceof AttachedLogisticalBlock && !(block instanceof TransposerBlock))
return direction == AttachedLogisticalBlock.getBlockFacing(state);
if (block instanceof FlowerPotBlock)
return direction == Direction.DOWN;
if (block instanceof RedstoneDiodeBlock)

View file

@ -109,7 +109,7 @@ public class ChassisRangeDisplay {
boolean ctrl = AllKeys.ctrlDown();
ChassisTileEntity chassisTileEntity = (ChassisTileEntity) tileEntity;
if (ctrl) {
GroupEntry existingGroupForPos = getExistingGroupForPos(pos);
if (existingGroupForPos != null) {
@ -119,7 +119,7 @@ public class ChassisRangeDisplay {
return;
}
}
if (!entries.containsKey(pos) || ctrl)
display(chassisTileEntity);
else {
@ -196,9 +196,11 @@ public class ChassisRangeDisplay {
float alpha = timer > 20 ? .5f : timer / 40f;
GlStateManager.color4f(1, .7f, 0, alpha);
Set<BlockPos> includedPositions = entry.includedPositions;
GlStateManager.depthMask(false);
for (BlockPos pos : includedPositions)
TessellatorHelper.cube(Tessellator.getInstance().getBuffer(), pos, size, 1 / 1024f, true, false);
TessellatorHelper.cube(Tessellator.getInstance().getBuffer(), pos, size, 1 / 16f - 1 / 64f, true, false);
TessellatorHelper.draw();
GlStateManager.depthMask(true);
}
private static GroupEntry getExistingGroupForPos(BlockPos pos) {

View file

@ -114,9 +114,7 @@ public abstract class Contraption {
frontier.add(pos);
if (!addToInitialFrontier(world, pos, forcedDirection, frontier))
return false;
Integer blockLimit = AllConfigs.SERVER.kinetics.maxBlocksMoved.get();
for (int limit = blockLimit; limit > 0; limit--) {
for (int limit = 100000; limit > 0; limit--) {
if (frontier.isEmpty())
return true;
if (!moveBlock(world, frontier.remove(0), forcedDirection, frontier, visited))
@ -183,6 +181,8 @@ public abstract class Contraption {
}
add(pos, capture(world, pos));
if (blocks.size() > AllConfigs.SERVER.kinetics.maxBlocksMoved.get())
return false;
return true;
}

View file

@ -11,6 +11,7 @@ import net.minecraft.block.material.PushReaction;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.IProjectile;
import net.minecraft.entity.MoverType;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.Direction;
@ -52,7 +53,7 @@ public class ContraptionCollider {
return;
for (Entity entity : world.getEntitiesWithinAABB((EntityType<?>) null, bounds.grow(1),
e -> e.getPushReaction() == PushReaction.NORMAL)) {
e -> canBeCollidedWith(e))) {
ReuseableStream<VoxelShape> potentialHits =
getPotentiallyCollidedShapes(world, contraption, contraptionPosition, entity);
@ -88,6 +89,16 @@ public class ContraptionCollider {
}
public static boolean canBeCollidedWith(Entity e) {
if (e instanceof PlayerEntity && e.isSpectator())
return false;
if (e.noClip)
return false;
if (e instanceof IProjectile)
return false;
return e.getPushReaction() == PushReaction.NORMAL;
}
@OnlyIn(Dist.CLIENT)
private static void checkForClientPlayerCollision(Entity entity) {
if (entity != Minecraft.getInstance().player)

View file

@ -54,7 +54,6 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD
protected Contraption contraption;
protected float initialAngle;
protected BlockPos controllerPos;
protected IControlContraption controllerTE;
protected Vec3d motionBeforeStall;
protected boolean stationary;
@ -103,12 +102,22 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD
public <T extends TileEntity & IControlContraption> ContraptionEntity controlledBy(T controller) {
this.controllerPos = controller.getPos();
this.controllerTE = controller;
return this;
}
private IControlContraption getController() {
if (controllerPos == null)
return null;
if (!world.isBlockPresent(controllerPos))
return null;
TileEntity te = world.getTileEntity(controllerPos);
if (!(te instanceof IControlContraption))
return null;
return (IControlContraption) te;
}
public boolean collisionEnabled() {
return stationary && controllerTE instanceof LinearActuatorTileEntity;
return getController() instanceof LinearActuatorTileEntity;
}
@Override
@ -118,7 +127,7 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD
return;
}
attachToController();
checkController();
Entity mountedEntity = getRidingEntity();
if (mountedEntity != null) {
@ -131,7 +140,7 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD
move(getMotion().x, getMotion().y, getMotion().z);
if (ContraptionCollider.collideBlocks(this))
controllerTE.collided();
getController().collided();
tickActors(new Vec3d(posX - prevPosX, posY - prevPosY, posZ - prevPosZ));
@ -256,8 +265,8 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD
if (!world.isRemote) {
if (!stalledPreviously && contraption.stalled) {
setMotion(Vec3d.ZERO);
if (controllerTE != null)
controllerTE.onStall();
if (getController() != null)
getController().onStall();
AllPackets.channel.send(PacketDistributor.TRACKING_ENTITY.with(() -> this),
new ContraptionStallPacket(getEntityId(), posX, posY, posZ, yaw, pitch, roll));
}
@ -368,22 +377,21 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD
controllerPos = NBTUtil.readBlockPos(compound.getCompound("Controller"));
}
public void attachToController() {
if (controllerPos != null && (controllerTE == null || !controllerTE.isValid())) {
if (!world.isBlockPresent(controllerPos))
return;
TileEntity te = world.getTileEntity(controllerPos);
if (te == null || !(te instanceof IControlContraption)) {
remove();
return;
}
IControlContraption controllerTE = (IControlContraption) te;
this.controllerTE = controllerTE;
controllerTE.attach(this);
if (world.isRemote)
setPosition(posX, posY, posZ);
public void checkController() {
if (controllerPos == null)
return;
if (!world.isBlockPresent(controllerPos))
return;
IControlContraption controller = getController();
if (controller == null) {
remove();
return;
}
if (controller.isAttachedTo(this))
return;
controller.attach(this);
if (world.isRemote)
setPosition(posX, posY, posZ);
}
@Override
@ -424,6 +432,10 @@ public class ContraptionEntity extends Entity implements IEntityAdditionalSpawnD
}
remove();
}
@Override
protected void doWaterSplashEffect() {
}
public void preventMovedEntitiesFromGettingStuck() {
Vec3d stuckTest = new Vec3d(0, -2, 0);

View file

@ -14,8 +14,8 @@ import com.simibubi.create.CreateClient;
import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.foundation.utility.PlacementSimulationWorld;
import com.simibubi.create.foundation.utility.SuperByteBuffer;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.SuperByteBufferCache.Compartment;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.foundation.utility.WrappedWorld;
import net.minecraft.block.BlockRenderType;

View file

@ -6,6 +6,8 @@ import com.simibubi.create.foundation.utility.Lang;
public interface IControlContraption {
public boolean isAttachedTo(ContraptionEntity contraption);
public void attach(ContraptionEntity contraption);
public void onStall();

View file

@ -7,6 +7,8 @@ import net.minecraft.block.ChestBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.properties.ChestType;
import net.minecraft.tileentity.BarrelTileEntity;
import net.minecraft.tileentity.ChestTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraftforge.items.CapabilityItemHandler;
@ -105,9 +107,9 @@ public class MountedStorage {
TileEntityType<?> type = te.getType();
if (type == AllTileEntities.FLEXCRATE.type)
return true;
if (type == TileEntityType.BARREL)
if (te instanceof ChestTileEntity)
return true;
if (type == TileEntityType.CHEST || type == TileEntityType.TRAPPED_CHEST)
if (te instanceof BarrelTileEntity)
return true;
return false;
}

View file

@ -203,21 +203,22 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe
@Override
public void attach(ContraptionEntity contraption) {
if (contraption.getContraption() instanceof ClockworkContraption) {
ClockworkContraption cc = (ClockworkContraption) contraption.getContraption();
markDirty();
Direction facing = getBlockState().get(BlockStateProperties.FACING);
BlockPos anchor = pos.offset(facing, cc.offset + 1);
if (cc.handType == HandType.HOUR) {
this.hourHand = contraption;
hourHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ());
} else {
this.minuteHand = contraption;
minuteHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ());
}
if (!world.isRemote)
sendData();
if (!(contraption.getContraption() instanceof ClockworkContraption))
return;
ClockworkContraption cc = (ClockworkContraption) contraption.getContraption();
markDirty();
Direction facing = getBlockState().get(BlockStateProperties.FACING);
BlockPos anchor = pos.offset(facing, cc.offset + 1);
if (cc.handType == HandType.HOUR) {
this.hourHand = contraption;
hourHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ());
} else {
this.minuteHand = contraption;
minuteHand.setPosition(anchor.getX(), anchor.getY(), anchor.getZ());
}
if (!world.isRemote)
sendData();
}
@Override
@ -287,4 +288,15 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe
public void collided() {
}
@Override
public boolean isAttachedTo(ContraptionEntity contraption) {
if (!(contraption.getContraption() instanceof ClockworkContraption))
return false;
ClockworkContraption cc = (ClockworkContraption) contraption.getContraption();
if (cc.handType == HandType.HOUR)
return this.hourHand == contraption;
else
return this.minuteHand == contraption;
}
}

View file

@ -1,5 +1,7 @@
package com.simibubi.create.modules.contraptions.components.contraptions.bearing;
import static net.minecraft.state.properties.BlockStateProperties.FACING;
import java.util.List;
import com.simibubi.create.AllTileEntities;
@ -14,8 +16,8 @@ import com.simibubi.create.modules.contraptions.components.contraptions.Contrapt
import com.simibubi.create.modules.contraptions.components.contraptions.ContraptionEntity;
import com.simibubi.create.modules.contraptions.components.contraptions.DirectionalExtenderScrollOptionSlot;
import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Direction.AxisDirection;
@ -32,6 +34,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
protected boolean assembleNextTick;
protected float clientAngleDiff;
protected ScrollOptionBehaviour<RotationMode> movementMode;
protected float lastGeneratedSpeed;
public MechanicalBearingTileEntity() {
super(AllTileEntities.MECHANICAL_BEARING.type);
@ -90,7 +93,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
if (!running || !isWindmill)
return 0;
if (movedContraption == null)
return 0;
return lastGeneratedSpeed;
int sails = ((BearingContraption) movedContraption.getContraption()).getSailBlocks() / 8;
return MathHelper.clamp(sails, 1, 16);
}
@ -100,6 +103,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
tag.putBoolean("Running", running);
tag.putBoolean("Windmill", isWindmill);
tag.putFloat("Angle", angle);
tag.putFloat("LastGenerated", lastGeneratedSpeed);
return super.write(tag);
}
@ -108,6 +112,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
running = tag.getBoolean("Running");
isWindmill = tag.getBoolean("Windmill");
angle = tag.getFloat("Angle");
lastGeneratedSpeed = tag.getFloat("LastGenerated");
super.read(tag);
}
@ -124,7 +129,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
@Override
public float getInterpolatedAngle(float partialTicks) {
if (movedContraption == null || movedContraption.isStalled())
if (movedContraption == null || movedContraption.isStalled() || !running)
partialTicks = 0;
return MathHelper.lerp(partialTicks, angle, angle + getAngularSpeed());
}
@ -145,7 +150,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
}
public void assemble() {
Direction direction = getBlockState().get(BlockStateProperties.FACING);
Direction direction = getBlockState().get(FACING);
// Collect Construct
BearingContraption contraption = BearingContraption.assembleBearingAt(world, pos, direction);
@ -167,6 +172,12 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
sendData();
updateGeneratedRotation();
}
@Override
public void updateGeneratedRotation() {
super.updateGeneratedRotation();
lastGeneratedSpeed = getGeneratedSpeed();
}
public void disassemble() {
if (!running)
@ -237,7 +248,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
protected void applyRotation() {
if (movedContraption != null) {
Axis axis = getBlockState().get(BlockStateProperties.FACING).getAxis();
Axis axis = getBlockState().get(FACING).getAxis();
Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis);
Vec3d vec = new Vec3d(1, 1, 1).scale(angle).mul(new Vec3d(direction.getDirectionVec()));
movedContraption.rotateTo(vec.x, vec.y, vec.z);
@ -246,14 +257,18 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
@Override
public void attach(ContraptionEntity contraption) {
if (contraption.getContraption() instanceof BearingContraption) {
this.movedContraption = contraption;
markDirty();
BlockPos anchor = pos.offset(getBlockState().get(BlockStateProperties.FACING));
movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ());
if (!world.isRemote)
sendData();
}
BlockState blockState = getBlockState();
if (!(contraption.getContraption() instanceof BearingContraption))
return;
if (!blockState.has(FACING))
return;
this.movedContraption = contraption;
markDirty();
BlockPos anchor = pos.offset(blockState.get(FACING));
movedContraption.setPosition(anchor.getX(), anchor.getY(), anchor.getZ());
if (!world.isRemote)
sendData();
}
@Override
@ -279,4 +294,9 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp
public void collided() {
}
@Override
public boolean isAttachedTo(ContraptionEntity contraption) {
return movedContraption == contraption;
}
}

View file

@ -44,7 +44,7 @@ public class MountedContraption extends Contraption {
Axis axis = state.get(RAIL_SHAPE) == RailShape.EAST_WEST ? Axis.X : Axis.Z;
contraption.add(pos, Pair.of(new BlockInfo(pos,
AllBlocks.MINECART_ANCHOR.block.getDefaultState().with(BlockStateProperties.HORIZONTAL_AXIS, axis),
AllBlocks.MINECART_ANCHOR.get().getDefaultState().with(BlockStateProperties.HORIZONTAL_AXIS, axis),
null), null));
contraption.removeBlocksFromWorld(world, BlockPos.ZERO);
contraption.initActors(world);

View file

@ -297,4 +297,9 @@ public abstract class LinearActuatorTileEntity extends KineticTileEntity impleme
sendData();
}
@Override
public boolean isAttachedTo(ContraptionEntity contraption) {
return movedContraption == contraption;
}
}

View file

@ -19,7 +19,7 @@ public class MechanicalPistonTileEntityRenderer extends KineticTileEntityRendere
@Override
protected BlockState getRenderedBlockState(KineticTileEntity te) {
return AllBlocks.SHAFT.block.getDefaultState().with(BlockStateProperties.AXIS,
return AllBlocks.SHAFT.get().getDefaultState().with(BlockStateProperties.AXIS,
((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState()));
}

View file

@ -14,8 +14,8 @@ import net.minecraft.state.EnumProperty;
import net.minecraft.state.properties.BlockStateProperties;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.shapes.ISelectionContext;

View file

@ -67,8 +67,8 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock
}
@Override
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return state.get(HORIZONTAL_FACING).getAxis() != face.getAxis();
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return true;
}
@Override

View file

@ -2,6 +2,7 @@ package com.simibubi.create.modules.contraptions.components.crafter;
import static com.simibubi.create.modules.contraptions.base.HorizontalKineticBlock.HORIZONTAL_FACING;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@ -207,7 +208,19 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
}
ItemStack result = RecipeGridHandler.tryToApplyRecipe(world, groupedItems);
if (result != null) {
List<ItemStack> containers = new ArrayList<>();
groupedItems.grid.values().forEach(stack -> {
if (stack.hasContainerItem())
containers.add(stack.getContainerItem().copy());
});
groupedItems = new GroupedItems(result);
containers.forEach(stack -> {
GroupedItems container = new GroupedItems(stack);
container.mergeOnto(groupedItems, Pointing.LEFT);
});
phase = Phase.CRAFTING;
countDown = 2000;
sendData();
@ -381,8 +394,8 @@ public class MechanicalCrafterTileEntity extends KineticTileEntity {
return;
if (world.isRemote)
return;
List<MechanicalCrafterTileEntity> chain = RecipeGridHandler.getAllCraftersOfChainIf(this,
MechanicalCrafterTileEntity::craftingItemPresent);
List<MechanicalCrafterTileEntity> chain =
RecipeGridHandler.getAllCraftersOfChainIf(this, MechanicalCrafterTileEntity::craftingItemPresent);
if (chain == null)
return;
chain.forEach(MechanicalCrafterTileEntity::begin);

View file

@ -32,8 +32,8 @@ import net.minecraft.util.math.Vec3d;
@SuppressWarnings("deprecation")
public class MechanicalCrafterTileEntityRenderer extends SafeTileEntityRenderer<MechanicalCrafterTileEntity> {
public static SpriteShiftEntry animatedTexture = SpriteShifter.get("block/crafter_thingies",
"block/crafter_thingies");
public static SpriteShiftEntry animatedTexture =
SpriteShifter.get("block/crafter_thingies", "block/crafter_thingies");
@Override
public void renderWithGL(MechanicalCrafterTileEntity te, double x, double y, double z, float partialTicks,
@ -44,8 +44,8 @@ public class MechanicalCrafterTileEntityRenderer extends SafeTileEntityRenderer<
if (te.phase == Phase.EXPORTING) {
Direction targetDirection = MechanicalCrafterBlock.getTargetDirection(te.getBlockState());
float progress = MathHelper.clamp((1000 - te.countDown + te.getCountDownSpeed() * partialTicks) / 1000f, 0,
1);
float progress =
MathHelper.clamp((1000 - te.countDown + te.getCountDownSpeed() * partialTicks) / 1000f, 0, 1);
vec = vec.add(new Vec3d(targetDirection.getDirectionVec()).scale(progress * .75f));
}
@ -83,23 +83,25 @@ public class MechanicalCrafterTileEntityRenderer extends SafeTileEntityRenderer<
if (te.phase == Phase.CRAFTING) {
items = te.groupedItemsBeforeCraft;
items.calcStats();
float progress = MathHelper.clamp((2000 - te.countDown + te.getCountDownSpeed() * partialTicks) / 1000f,
0, 1);
float progress =
MathHelper.clamp((2000 - te.countDown + te.getCountDownSpeed() * partialTicks) / 1000f, 0, 1);
float earlyProgress = MathHelper.clamp(progress * 2, 0, 1);
float lateProgress = MathHelper.clamp(progress * 2 - 1, 0, 1);
// GlStateManager.rotated(lateProgress * 360, 0, 0, 1);
GlStateManager.scaled(1 - lateProgress, 1 - lateProgress, 1 - lateProgress);
Vec3d centering = new Vec3d(-items.minX + (-items.width + 1) / 2f,
-items.minY + (-items.height + 1) / 2f, 0).scale(earlyProgress);
Vec3d centering =
new Vec3d(-items.minX + (-items.width + 1) / 2f, -items.minY + (-items.height + 1) / 2f, 0)
.scale(earlyProgress);
GlStateManager.translated(centering.x * .5f, centering.y * .5f, 0);
distance += (-4 * (progress - .5f) * (progress - .5f) + 1) * .25f;
}
boolean onlyRenderFirst = te.phase == Phase.INSERTING || te.phase == Phase.CRAFTING && te.countDown < 1000;
final float spacing = distance;
items.grid.forEach((pair, stack) -> {
if (onlyRenderFirst && (pair.getLeft().intValue() != 0 || pair.getRight().intValue() != 0))
return;
GlStateManager.pushMatrix();
GlStateManager.translatef(pair.getKey() * spacing, pair.getValue() * spacing, 0);
TessellatorHelper.fightZFighting(pair.hashCode() + te.getPos().hashCode());
@ -111,8 +113,8 @@ public class MechanicalCrafterTileEntityRenderer extends SafeTileEntityRenderer<
if (te.phase == Phase.CRAFTING) {
items = te.groupedItems;
float progress = MathHelper.clamp((1000 - te.countDown + te.getCountDownSpeed() * partialTicks) / 1000f,
0, 1);
float progress =
MathHelper.clamp((1000 - te.countDown + te.getCountDownSpeed() * partialTicks) / 1000f, 0, 1);
float earlyProgress = MathHelper.clamp(progress * 2, 0, 1);
float lateProgress = MathHelper.clamp(progress * 2 - 1, 0, 1);
@ -123,6 +125,8 @@ public class MechanicalCrafterTileEntityRenderer extends SafeTileEntityRenderer<
GlStateManager.scaled(downScaling, downScaling, downScaling);
items.grid.forEach((pair, stack) -> {
if (pair.getLeft().intValue() != 0 || pair.getRight().intValue() != 0)
return;
Minecraft.getInstance().getItemRenderer().renderItem(stack, TransformType.FIXED);
});
}
@ -153,8 +157,8 @@ public class MechanicalCrafterTileEntityRenderer extends SafeTileEntityRenderer<
if (MechanicalCrafterBlock.isValidTarget(getWorld(), pos.offset(targetDirection), blockState)) {
SuperByteBuffer beltBuffer = renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_BELT, blockState, pos);
SuperByteBuffer beltFrameBuffer = renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_BELT_FRAME, blockState,
pos);
SuperByteBuffer beltFrameBuffer =
renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_BELT_FRAME, blockState, pos);
if (te.phase == Phase.EXPORTING) {
int textureIndex = (int) ((te.getCountDownSpeed() / 128f * AnimationTickHolder.ticks));
@ -168,7 +172,8 @@ public class MechanicalCrafterTileEntityRenderer extends SafeTileEntityRenderer<
beltFrameBuffer.translate(x, y, z).renderInto(buffer);
} else {
SuperByteBuffer arrowBuffer = renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_ARROW, blockState, pos);
SuperByteBuffer arrowBuffer =
renderAndTransform(AllBlockPartials.MECHANICAL_CRAFTER_ARROW, blockState, pos);
arrowBuffer.translate(x, y, z).renderInto(buffer);
}

View file

@ -0,0 +1,20 @@
package com.simibubi.create.modules.contraptions.components.crusher;
import java.util.List;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.modules.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public abstract class AbstractCrushingRecipe extends ProcessingRecipe<RecipeWrapper> {
public AbstractCrushingRecipe(AllRecipes recipeType, ResourceLocation id, String group,
List<ProcessingIngredient> ingredients, List<ProcessingOutput> results, int processingDuration) {
super(recipeType, id, group, ingredients, results, processingDuration);
}
}

View file

@ -5,13 +5,12 @@ import java.util.List;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.modules.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class CrushingRecipe extends ProcessingRecipe<RecipeWrapper> {
public class CrushingRecipe extends AbstractCrushingRecipe {
public CrushingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) {

View file

@ -101,7 +101,7 @@ public class CrushingWheelBlock extends RotatedPillarKineticBlock {
world.setBlockState(controllerPos, world.getBlockState(controllerPos).with(VALID, controllerShouldBeValid));
}
((CrushingWheelControllerBlock) AllBlocks.CRUSHING_WHEEL_CONTROLLER.block)
((CrushingWheelControllerBlock) AllBlocks.CRUSHING_WHEEL_CONTROLLER.get())
.updateSpeed(world.getBlockState(controllerPos), world, controllerPos);
}

View file

@ -13,6 +13,7 @@ import com.simibubi.create.foundation.block.SyncedTileEntity;
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.processing.ProcessingInventory;
import com.simibubi.create.modules.contraptions.processing.ProcessingRecipe;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
@ -172,8 +173,7 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
}
private void applyRecipe() {
Optional<CrushingRecipe> recipe =
world.getRecipeManager().getRecipe(AllRecipes.CRUSHING.getType(), wrapper, world);
Optional<ProcessingRecipe<RecipeWrapper>> recipe = findRecipe();
List<ItemStack> list = new ArrayList<>();
if (recipe.isPresent()) {
@ -194,6 +194,14 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
}
public Optional<ProcessingRecipe<RecipeWrapper>> findRecipe() {
Optional<ProcessingRecipe<RecipeWrapper>> crushingRecipe =
world.getRecipeManager().getRecipe(AllRecipes.CRUSHING.getType(), wrapper, world);
if (!crushingRecipe.isPresent())
crushingRecipe = world.getRecipeManager().getRecipe(AllRecipes.MILLING.getType(), wrapper, world);
return crushingRecipe;
}
@Override
public CompoundNBT write(CompoundNBT compound) {
if (hasEntity() && !isFrozen())
@ -222,8 +230,7 @@ public class CrushingWheelControllerTileEntity extends SyncedTileEntity implemen
}
private void itemInserted(ItemStack stack) {
Optional<CrushingRecipe> recipe =
world.getRecipeManager().getRecipe(AllRecipes.CRUSHING.getType(), wrapper, world);
Optional<ProcessingRecipe<RecipeWrapper>> recipe = findRecipe();
inventory.remainingTime = recipe.isPresent() ? recipe.get().getProcessingDuration() : 100;
inventory.appliedRecipe = false;
}

View file

@ -104,8 +104,9 @@ public class DeployerMovementBehaviour extends MovementBehaviour {
if (player == null)
return;
if (player.getHeldItemMainhand().isEmpty()) {
ItemStack filter = getFilter(context);
ItemStack held = ItemHelper.extract(context.contraption.inventory,
stack -> FilterItem.test(stack, getFilter(context)), 1, false);
stack -> FilterItem.test(context.world, stack, filter), 1, false);
player.setHeldItem(Hand.MAIN_HAND, held);
}
}
@ -123,7 +124,8 @@ public class DeployerMovementBehaviour extends MovementBehaviour {
if (itemstack.isEmpty())
continue;
if (list == inv.mainInventory && i == inv.currentItem && FilterItem.test(itemstack, filter))
if (list == inv.mainInventory && i == inv.currentItem
&& FilterItem.test(context.world, itemstack, filter))
continue;
dropItem(context, itemstack);

View file

@ -135,7 +135,7 @@ public class DeployerTileEntityRenderer extends SafeTileEntityRenderer<DeployerT
BlockState state = te.getBlockState();
if (!AllBlocks.DEPLOYER.typeOf(state))
return Blocks.AIR.getDefaultState();
return AllBlocks.SHAFT.block.getDefaultState().with(AXIS, ((IRotate) state.getBlock()).getRotationAxis(state));
return AllBlocks.SHAFT.get().getDefaultState().with(AXIS, ((IRotate) state.getBlock()).getRotationAxis(state));
}
private static SuperByteBuffer renderAndTransform(World world, AllBlockPartials renderBlock,

View file

@ -14,8 +14,8 @@ import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Direction.AxisDirection;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.Rotation;
import net.minecraft.util.math.MathHelper;
public class FlywheelRenderer extends KineticTileEntityRenderer {

View file

@ -0,0 +1,33 @@
package com.simibubi.create.modules.contraptions.components.millstone;
import java.util.List;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.modules.contraptions.components.crusher.AbstractCrushingRecipe;
import com.simibubi.create.modules.contraptions.processing.ProcessingIngredient;
import com.simibubi.create.modules.contraptions.processing.ProcessingOutput;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class MillingRecipe extends AbstractCrushingRecipe {
public MillingRecipe(ResourceLocation id, String group, List<ProcessingIngredient> ingredients,
List<ProcessingOutput> results, int processingDuration) {
super(AllRecipes.MILLING, id, group, ingredients, results, processingDuration);
}
@Override
public boolean matches(RecipeWrapper inv, World worldIn) {
if (inv.isEmpty())
return false;
return ingredients.get(0).test(inv.getStackInSlot(0));
}
@Override
protected int getMaxOutputCount() {
return 4;
}
}

View file

@ -0,0 +1,141 @@
package com.simibubi.create.modules.contraptions.components.millstone;
import com.simibubi.create.foundation.utility.AllShapes;
import com.simibubi.create.modules.contraptions.base.KineticBlock;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.InventoryHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemStackHandler;
public class MillstoneBlock extends KineticBlock {
public MillstoneBlock() {
super(Properties.from(Blocks.ANDESITE));
}
@Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return new MillstoneTileEntity();
}
@Override
protected boolean hasStaticPart() {
return true;
}
@Override
public VoxelShape getShape(BlockState state, IBlockReader worldIn, BlockPos pos, ISelectionContext context) {
return AllShapes.MILLSTONE;
}
@Override
public boolean hasShaftTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return face == Direction.DOWN;
}
@Override
public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
BlockRayTraceResult hit) {
if (!player.getHeldItem(handIn).isEmpty())
return false;
if (worldIn.getTileEntity(pos) == null)
return false;
if (worldIn.isRemote)
return true;
TileEntity tileEntity = worldIn.getTileEntity(pos);
if (!(tileEntity instanceof MillstoneTileEntity))
return false;
MillstoneTileEntity millstone = (MillstoneTileEntity) tileEntity;
IItemHandlerModifiable inv = millstone.outputInv;
for (int slot = 0; slot < inv.getSlots(); slot++) {
player.inventory.placeItemBackInInventory(worldIn, inv.getStackInSlot(slot));
inv.setStackInSlot(slot, ItemStack.EMPTY);
}
millstone.markDirty();
millstone.sendData();
return true;
}
@Override
public void onLanded(IBlockReader worldIn, Entity entityIn) {
super.onLanded(worldIn, entityIn);
if (entityIn.world.isRemote)
return;
if (!(entityIn instanceof ItemEntity))
return;
BlockPos pos = entityIn.getPosition();
TileEntity tileEntity = worldIn.getTileEntity(pos);
if (!(tileEntity instanceof MillstoneTileEntity)) {
tileEntity = worldIn.getTileEntity(pos.down());
if (!(tileEntity instanceof MillstoneTileEntity))
return;
}
MillstoneTileEntity millstone = (MillstoneTileEntity) tileEntity;
ItemEntity itemEntity = (ItemEntity) entityIn;
LazyOptional<IItemHandler> capability = millstone.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
if (!capability.isPresent())
return;
ItemStack remainder = capability.orElse(new ItemStackHandler()).insertItem(0, itemEntity.getItem(), false);
if (remainder.isEmpty())
itemEntity.remove();
if (remainder.getCount() < itemEntity.getItem().getCount())
itemEntity.setItem(remainder);
}
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (state.hasTileEntity() && state.getBlock() != newState.getBlock()) {
TileEntity tileEntity = worldIn.getTileEntity(pos);
if (!(tileEntity instanceof MillstoneTileEntity))
return;
MillstoneTileEntity te = (MillstoneTileEntity) tileEntity;
for (int slot = 0; slot < te.inputInv.getSlots(); slot++) {
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(),
te.inputInv.getStackInSlot(slot));
}
for (int slot = 0; slot < te.outputInv.getSlots(); slot++) {
InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(),
te.outputInv.getStackInSlot(slot));
}
worldIn.removeTileEntity(pos);
}
}
@Override
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return true;
}
@Override
public Axis getRotationAxis(BlockState state) {
return Axis.Y;
}
}

View file

@ -0,0 +1,16 @@
package com.simibubi.create.modules.contraptions.components.millstone;
import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.CreateClient;
import com.simibubi.create.foundation.utility.SuperByteBuffer;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.base.KineticTileEntityRenderer;
public class MillstoneRenderer extends KineticTileEntityRenderer {
@Override
protected SuperByteBuffer getRotatedModel(KineticTileEntity te) {
return CreateClient.bufferCache.renderPartial(AllBlockPartials.MILLSTONE_COG, te.getBlockState());
}
}

View file

@ -0,0 +1,174 @@
package com.simibubi.create.modules.contraptions.components.millstone;
import java.util.Optional;
import com.simibubi.create.AllRecipes;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.particles.ItemParticleData;
import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.Direction;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.Vec3d;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
import net.minecraftforge.items.wrapper.RecipeWrapper;
public class MillstoneTileEntity extends KineticTileEntity {
public ItemStackHandler inputInv;
public ItemStackHandler outputInv;
public int timer;
private MillingRecipe lastRecipe;
public MillstoneTileEntity() {
super(AllTileEntities.MILLSTONE.type);
inputInv = new ItemStackHandler(1);
outputInv = new ItemStackHandler(9);
}
@Override
public void tick() {
super.tick();
if (getSpeed() == 0)
return;
for (int i = 0; i < outputInv.getSlots(); i++)
if (outputInv.getStackInSlot(i).getCount() == outputInv.getSlotLimit(i))
return;
if (timer > 0) {
timer -= getProcessingSpeed();
if (world.isRemote) {
spawnParticles();
return;
}
if (timer <= 0)
process();
return;
}
if (inputInv.getStackInSlot(0).isEmpty())
return;
RecipeWrapper inventoryIn = new RecipeWrapper(inputInv);
if (lastRecipe == null || !lastRecipe.matches(inventoryIn, world)) {
Optional<MillingRecipe> recipe =
world.getRecipeManager().getRecipe(AllRecipes.MILLING.getType(), inventoryIn, world);
if (!recipe.isPresent()) {
timer = 100;
sendData();
} else {
lastRecipe = recipe.get();
timer = lastRecipe.getProcessingDuration();
sendData();
}
return;
}
timer = lastRecipe.getProcessingDuration();
sendData();
}
private void process() {
RecipeWrapper inventoryIn = new RecipeWrapper(inputInv);
if (lastRecipe == null || !lastRecipe.matches(inventoryIn, world)) {
Optional<MillingRecipe> recipe =
world.getRecipeManager().getRecipe(AllRecipes.MILLING.getType(), inventoryIn, world);
if (!recipe.isPresent())
return;
lastRecipe = recipe.get();
}
ItemStack stackInSlot = inputInv.getStackInSlot(0);
stackInSlot.shrink(1);
inputInv.setStackInSlot(0, stackInSlot);
lastRecipe.rollResults().forEach(stack -> ItemHandlerHelper.insertItemStacked(outputInv, stack, false));
sendData();
markDirty();
}
public void spawnParticles() {
ItemStack stackInSlot = inputInv.getStackInSlot(0);
if (stackInSlot.isEmpty())
return;
ItemParticleData data = new ItemParticleData(ParticleTypes.ITEM, stackInSlot);
float angle = world.rand.nextFloat() * 360;
Vec3d offset = new Vec3d(0, 0, 0.5f);
offset = VecHelper.rotate(offset, angle, Axis.Y);
Vec3d target = VecHelper.rotate(offset, getSpeed() > 0 ? 25 : -25, Axis.Y);
Vec3d center = offset.add(VecHelper.getCenterOf(pos));
target = VecHelper.offsetRandomly(target.subtract(offset), world.rand, 1 / 128f);
world.addParticle(data, center.x, center.y, center.z, target.x, target.y, target.z);
}
@Override
public CompoundNBT write(CompoundNBT compound) {
compound.putInt("Timer", timer);
compound.put("InputInventory", inputInv.serializeNBT());
compound.put("OutputInventory", outputInv.serializeNBT());
return super.write(compound);
}
@Override
public void read(CompoundNBT compound) {
timer = compound.getInt("Timer");
inputInv.deserializeNBT(compound.getCompound("InputInventory"));
outputInv.deserializeNBT(compound.getCompound("OutputInventory"));
super.read(compound);
}
public int getProcessingSpeed() {
return MathHelper.clamp((int) Math.abs(getSpeed() / 16f), 1, 512);
}
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, Direction side) {
if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
return LazyOptional.of(MillstoneInventoryHandler::new).cast();
return super.getCapability(cap, side);
}
private class MillstoneInventoryHandler extends CombinedInvWrapper {
public MillstoneInventoryHandler() {
super(inputInv, outputInv);
}
@Override
public boolean isItemValid(int slot, ItemStack stack) {
if (outputInv == getHandlerFromIndex(getIndexForSlot(slot)))
return false;
return super.isItemValid(slot, stack);
}
@Override
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
if (outputInv == getHandlerFromIndex(getIndexForSlot(slot)))
return stack;
return super.insertItem(slot, stack, simulate);
}
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate) {
if (inputInv == getHandlerFromIndex(getIndexForSlot(slot)))
return ItemStack.EMPTY;
return super.extractItem(slot, amount, simulate);
}
}
}

View file

@ -66,8 +66,8 @@ public class MechanicalMixerBlock extends KineticBlock
}
@Override
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return face.getAxis().isHorizontal();
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return true;
}
@Override

View file

@ -97,7 +97,12 @@ public class SawBlock extends DirectionalAxisKineticBlock implements IWithTileEn
super.onLanded(worldIn, entityIn);
if (!(entityIn instanceof ItemEntity))
return;
withTileEntityDo(entityIn.world, entityIn.getPosition(), te -> {
BlockPos pos = entityIn.getPosition();
if (!(worldIn.getTileEntity(pos) instanceof SawTileEntity))
return;
if (entityIn.world.isRemote)
return;
withTileEntityDo(entityIn.world, pos, te -> {
te.insertItem((ItemEntity) entityIn);
});
}

View file

@ -88,7 +88,7 @@ public class SawTileEntityRenderer extends SafeTileEntityRenderer<SawTileEntity>
protected BlockState getRenderedBlockState(KineticTileEntity te) {
BlockState state = te.getBlockState();
return AllBlocks.SHAFT.block.getDefaultState().with(AXIS, ((IRotate) state.getBlock()).getRotationAxis(state));
return AllBlocks.SHAFT.get().getDefaultState().with(AXIS, ((IRotate) state.getBlock()).getRotationAxis(state));
}
}

View file

@ -41,17 +41,34 @@ public class GoggleOverlayRenderer {
ItemStack goggles = mc.player.getItemStackFromSlot(EquipmentSlotType.HEAD);
TileEntity te = world.getTileEntity(pos);
if (!AllItems.GOGGLES.typeOf(goggles))
return;
boolean goggleInformation = te instanceof IHaveGoggleInformation;
boolean hoveringInformation = te instanceof IHaveHoveringInformation;
if (!(te instanceof IHaveGoggleInformation))
if (!goggleInformation && !hoveringInformation)
return;
IHaveGoggleInformation gte = (IHaveGoggleInformation) te;
List<String> tooltip = new ArrayList<>();
if (!gte.addToGoggleTooltip(tooltip, mc.player.isSneaking()))
if (goggleInformation && AllItems.GOGGLES.typeOf(goggles)) {
IHaveGoggleInformation gte = (IHaveGoggleInformation) te;
if (!gte.addToGoggleTooltip(tooltip, mc.player.isSneaking()))
goggleInformation = false;
}
if (hoveringInformation) {
boolean goggleAddedInformation = !tooltip.isEmpty();
if (goggleAddedInformation)
tooltip.add("");
IHaveHoveringInformation hte = (IHaveHoveringInformation) te;
if (!hte.addToTooltip(tooltip, mc.player.isSneaking()))
hoveringInformation = false;
if (goggleAddedInformation && !hoveringInformation)
tooltip.remove(tooltip.size() - 1);
}
if (!goggleInformation && !hoveringInformation)
return;
if (tooltip.isEmpty())
return;
GlStateManager.pushMatrix();
@ -70,7 +87,7 @@ public class GoggleOverlayRenderer {
tooltipScreen.init(mc, mc.mainWindow.getScaledWidth(), mc.mainWindow.getScaledHeight());
tooltipScreen.renderTooltip(tooltip, tooltipScreen.width / 2, tooltipScreen.height / 2);
ItemStack item = goggles;
ItemStack item = AllItems.GOGGLES.asStack();
ScreenElementRenderer.render3DItem(() -> {
GlStateManager.translated(tooltipScreen.width / 2 + 10, tooltipScreen.height / 2 - 16, 0);
return item;

View file

@ -0,0 +1,14 @@
package com.simibubi.create.modules.contraptions.goggle;
import java.util.List;
/*
* Implement this Interface in the TileEntity class that wants to add info to the screen
* */
public interface IHaveHoveringInformation {
default boolean addToTooltip(List<String> tooltip, boolean isPlayerSneaking){
return false;
}
}

View file

@ -11,9 +11,7 @@ import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.processing.BasinTileEntity.BasinInventory;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.BucketItem;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.tileentity.TileEntity;
@ -53,6 +51,8 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
}
public void gatherInputs() {
if (!basinInv.isPresent())
return;
BasinInventory inv = (BasinInventory) basinInv.orElse(null);
inputs = new ArrayList<>();
IItemHandlerModifiable inputHandler = inv.getInputHandler();
@ -128,8 +128,8 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
IItemHandlerModifiable inputs = inv.getInputHandler();
IItemHandlerModifiable outputs = inv.getOutputHandler();
List<ItemStack> catalysts = new ArrayList<>();
List<ItemStack> containers = new ArrayList<>();
int buckets = 0;
NonNullList<Ingredient> ingredients = lastRecipe.getIngredients();
Ingredients: for (int i = 0; i < ingredients.size(); i++) {
Ingredient ingredient = ingredients.get(i);
@ -137,12 +137,11 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
if (!ingredient.test(inputs.extractItem(slot, 1, true)))
continue;
ItemStack extracted = inputs.extractItem(slot, 1, false);
if (extracted.getItem() instanceof BucketItem)
buckets++;
if ((lastRecipe instanceof ProcessingRecipe)) {
if (((ProcessingRecipe<?>) lastRecipe).getRollableIngredients().get(i).remains())
catalysts.add(extracted.copy());
if ((lastRecipe instanceof ProcessingRecipe)
&& ((ProcessingRecipe<?>) lastRecipe).getRollableIngredients().get(i).remains()) {
catalysts.add(extracted.copy());
} else if (extracted.hasContainerItem()) {
containers.add(extracted.getContainerItem().copy());
}
continue Ingredients;
}
@ -151,8 +150,7 @@ public abstract class BasinOperatingTileEntity extends KineticTileEntity {
}
ItemHandlerHelper.insertItemStacked(outputs, lastRecipe.getRecipeOutput().copy(), false);
if (buckets > 0)
ItemHandlerHelper.insertItemStacked(outputs, new ItemStack(Items.BUCKET, buckets), false);
containers.forEach(stack -> ItemHandlerHelper.insertItemStacked(outputs, stack, false));
catalysts.forEach(c -> ItemHandlerHelper.insertItemStacked(outputs, c, false));
// Continue mixing

View file

@ -6,12 +6,10 @@ import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.behaviour.base.SmartTileEntity;
import com.simibubi.create.foundation.behaviour.base.TileEntityBehaviour;
import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation;
import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.math.MathHelper;
public class AnalogLeverTileEntity extends SmartTileEntity implements IHaveGoggleInformation {

View file

@ -31,8 +31,8 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
super.addBehaviours(behaviours);
Integer max = AllConfigs.SERVER.kinetics.maxRotationSpeed.get();
targetSpeed = new ScrollValueBehaviour(Lang.translate("generic.speed"), this,
new ControllerValueBoxTransform());
targetSpeed =
new ScrollValueBehaviour(Lang.translate("generic.speed"), this, new ControllerValueBoxTransform());
targetSpeed.between(-max, max);
targetSpeed.value = DEFAULT_SPEED;
targetSpeed.moveText(new Vec3d(9, 0, 10));
@ -43,7 +43,7 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
}
private void updateTargetRotation() {
if (hasNetwork())
if (hasNetwork())
getOrCreateNetwork().remove(this);
RotationPropagator.handleRemoved(world, pos, this);
removeSource();
@ -54,38 +54,38 @@ public class SpeedControllerTileEntity extends KineticTileEntity {
public boolean hasFastRenderer() {
return false;
}
public static float getSpeedModifier(KineticTileEntity cogWheel, KineticTileEntity speedControllerIn,
public static float getConveyedSpeed(KineticTileEntity cogWheel, KineticTileEntity speedControllerIn,
boolean targetingController) {
if (!(speedControllerIn instanceof SpeedControllerTileEntity))
return 1;
return 0;
SpeedControllerTileEntity speedController = (SpeedControllerTileEntity) speedControllerIn;
float targetSpeed = speedController.targetSpeed.getValue();
float speed = speedControllerIn.getSpeed();
float wheelSpeed = cogWheel.getTheoreticalSpeed();
if (targetSpeed == 0)
return 0;
float wheelSpeed = cogWheel.getTheoreticalSpeed();
if (targetingController && wheelSpeed == 0)
return 1;
return 0;
if (!speedController.hasSource()) {
if (targetingController)
return targetSpeed / wheelSpeed;
return 1;
return targetSpeed;
return 0;
}
boolean wheelPowersController = speedController.source.equals(cogWheel.getPos());
if (wheelPowersController) {
if (targetingController)
return targetSpeed / wheelSpeed;
return wheelSpeed / targetSpeed;
return targetSpeed;
return wheelSpeed;
}
if (targetingController)
return speed / targetSpeed;
return targetSpeed / speed;
return speed;
return targetSpeed;
}
private class ControllerValueBoxTransform extends ValueBoxTransform.Sided {

View file

@ -1,6 +1,5 @@
package com.simibubi.create.modules.contraptions.relays.belt;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
@ -104,11 +103,12 @@ public class BeltBlock extends HorizontalKineticBlock
@SuppressWarnings("deprecation")
@Override
public List<ItemStack> getDrops(BlockState state, net.minecraft.world.storage.loot.LootContext.Builder builder) {
List<ItemStack> drops = new ArrayList<>();
if (state.get(PART) == Part.START || builder.get(LootParameters.THIS_ENTITY) != null)
drops.addAll(super.getDrops(state, builder));
List<ItemStack> drops = super.getDrops(state, builder);
if (state.get(CASING))
drops.addAll(AllBlocks.BRASS_CASING.getDefault().getDrops(builder));
TileEntity tileEntity = builder.get(LootParameters.BLOCK_ENTITY);
if (tileEntity instanceof BeltTileEntity && ((BeltTileEntity) tileEntity).hasPulley())
drops.addAll(AllBlocks.SHAFT.getDefault().getDrops(builder));
return drops;
}
@ -117,8 +117,6 @@ public class BeltBlock extends HorizontalKineticBlock
withTileEntityDo(worldIn, pos, te -> {
if (worldIn.isRemote)
return;
if (te.hasPulley())
Block.spawnDrops(AllBlocks.SHAFT.get().getDefaultState(), worldIn, pos);
if (te.isController()) {
BeltInventory inv = te.getInventory();
for (TransportedItemStack s : inv.items)
@ -293,7 +291,7 @@ public class BeltBlock extends HorizontalKineticBlock
return ActionResultType.SUCCESS;
world.setBlockState(context.getPos(), state.with(CASING, false), 3);
if (!player.isCreative())
player.inventory.placeItemBackInInventory(world, new ItemStack(AllBlocks.BRASS_CASING.block));
player.inventory.placeItemBackInInventory(world, new ItemStack(AllBlocks.BRASS_CASING.get()));
return ActionResultType.SUCCESS;
}
@ -304,7 +302,7 @@ public class BeltBlock extends HorizontalKineticBlock
belt.detachKinetics();
belt.attachKinetics();
if (!player.isCreative())
player.inventory.placeItemBackInInventory(world, new ItemStack(AllBlocks.SHAFT.block));
player.inventory.placeItemBackInInventory(world, new ItemStack(AllBlocks.SHAFT.get()));
return ActionResultType.SUCCESS;
}

View file

@ -13,6 +13,8 @@ class BeltColor implements IBlockColor {
@Override
public int getColor(BlockState state, IEnviromentBlockReader reader, BlockPos pos, int layer) {
if (reader == null)
return 0;
TileEntity tileEntity = reader.getTileEntity(pos);
if (tileEntity instanceof BeltTileEntity) {
BeltTileEntity te = (BeltTileEntity) tileEntity;

View file

@ -27,7 +27,7 @@ import net.minecraft.world.World;
public class BeltConnectorItem extends BlockItem implements IAddedByOther {
public BeltConnectorItem(Properties properties) {
super(AllBlocks.BELT.block, properties);
super(AllBlocks.BELT.get(), properties);
}
@Override

View file

@ -37,12 +37,14 @@ public class BeltInventory {
final BeltTileEntity belt;
final List<TransportedItemStack> items;
final List<TransportedItemStack> toInsert;
boolean beltMovementPositive;
final float SEGMENT_WINDOW = .75f;
public BeltInventory(BeltTileEntity te) {
this.belt = te;
items = new LinkedList<>();
toInsert = new LinkedList<>();
}
public void tick() {
@ -54,6 +56,14 @@ public class BeltInventory {
belt.markDirty();
belt.sendData();
}
// Add items from previous cycle
if (!toInsert.isEmpty()) {
toInsert.forEach(this::insert);
toInsert.clear();
belt.markDirty();
belt.sendData();
}
// Assuming the first entry is furthest on the belt
TransportedItemStack stackInFront = null;
@ -325,18 +335,29 @@ public class BeltInventory {
else if (!beltMovementPositive)
segmentPos += 1f;
for (TransportedItemStack stack : items) {
float currentPos = stack.beltPosition;
if (stack.insertedAt == segment && stack.insertedFrom == side
&& (beltMovementPositive ? currentPos <= segmentPos + 1 : currentPos >= segmentPos - 1))
for (TransportedItemStack stack : items)
if (isBlocking(segment, side, segmentPos, stack))
return false;
}
for (TransportedItemStack stack : toInsert)
if (isBlocking(segment, side, segmentPos, stack))
return false;
return true;
}
protected void insert(TransportedItemStack newStack) {
private boolean isBlocking(int segment, Direction side, float segmentPos, TransportedItemStack stack) {
float currentPos = stack.beltPosition;
if (stack.insertedAt == segment && stack.insertedFrom == side
&& (beltMovementPositive ? currentPos <= segmentPos + 1 : currentPos >= segmentPos - 1))
return true;
return false;
}
public void addItem(TransportedItemStack newStack) {
toInsert.add(newStack);
}
private void insert(TransportedItemStack newStack) {
if (items.isEmpty())
items.add(newStack);
else {

View file

@ -347,7 +347,7 @@ public class BeltTileEntity extends KineticTileEntity {
transportedStack.insertedAt = index;
transportedStack.insertedFrom = side;
transportedStack.prevBeltPosition = transportedStack.beltPosition;
nextInventory.insert(transportedStack);
nextInventory.addItem(transportedStack);
nextBeltController.markDirty();
nextBeltController.sendData();

View file

@ -34,7 +34,7 @@ public class ItemHandlerBeltSegment implements IItemHandler {
newStack.insertedAt = offset;
newStack.beltPosition = offset + .5f + (beltInventory.beltMovementPositive ? -1 : 1) / 16f;
newStack.prevBeltPosition = newStack.beltPosition;
this.beltInventory.insert(newStack);
this.beltInventory.addItem(newStack);
this.beltInventory.belt.markDirty();
this.beltInventory.belt.sendData();
}

View file

@ -14,8 +14,8 @@ import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction;
import net.minecraft.util.NonNullList;
import net.minecraft.util.Direction.Axis;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
@ -64,7 +64,7 @@ public class CogWheelBlock extends ShaftBlock implements IHaveCustomBlockItem {
}
if (!(block instanceof IRotate)
|| !(((IRotate) block).hasCogsTowards(world, placedOnPos, placedAgainst, context.getFace()))) {
|| !(((IRotate) block).hasIntegratedCogwheel(world, placedOnPos, placedAgainst))) {
Axis preferredAxis = getPreferredAxis(context);
if (preferredAxis != null)
return this.getDefaultState().with(AXIS, preferredAxis);
@ -91,8 +91,8 @@ public class CogWheelBlock extends ShaftBlock implements IHaveCustomBlockItem {
// IRotate
@Override
public boolean hasCogsTowards(IWorldReader world, BlockPos pos, BlockState state, Direction face) {
return !isLarge && face.getAxis() != state.get(AXIS);
public boolean hasIntegratedCogwheel(IWorldReader world, BlockPos pos, BlockState state) {
return !isLarge;
}
@Override

View file

@ -6,6 +6,7 @@ import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.foundation.utility.VecHelper;
import com.simibubi.create.modules.contraptions.base.DirectionalAxisKineticBlock;
import com.simibubi.create.modules.contraptions.base.IRotate;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
@ -25,7 +26,6 @@ import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World;
public class GaugeBlock extends DirectionalAxisKineticBlock {
@ -65,34 +65,41 @@ public class GaugeBlock extends DirectionalAxisKineticBlock {
return Blocks.SPRUCE_PLANKS.getMaterialColor(state, worldIn, pos);
}
@Override
public BlockState getStateForPlacement(BlockItemUseContext context) {
World world = context.getWorld();
Direction face = context.getFace();
BlockPos placedOnPos = context.getPos().offset(context.getFace().getOpposite());
BlockState placedOnState = world.getBlockState(placedOnPos);
Block block = placedOnState.getBlock();
if (block instanceof IRotate && ((IRotate) block).hasShaftTowards(world, placedOnPos, placedOnState, face)) {
BlockState toPlace = getDefaultState();
Direction horizontalFacing = context.getPlacementHorizontalFacing();
Direction nearestLookingDirection = context.getNearestLookingDirection();
boolean lookPositive = nearestLookingDirection.getAxisDirection() == AxisDirection.POSITIVE;
if (face.getAxis() == Axis.X) {
toPlace = toPlace.with(FACING, lookPositive ? Direction.NORTH : Direction.SOUTH)
.with(AXIS_ALONG_FIRST_COORDINATE, true);
} else if (face.getAxis() == Axis.Y) {
toPlace = toPlace.with(FACING, horizontalFacing.getOpposite()).with(AXIS_ALONG_FIRST_COORDINATE,
horizontalFacing.getAxis() == Axis.X);
} else {
toPlace = toPlace.with(FACING, lookPositive ? Direction.WEST : Direction.EAST)
.with(AXIS_ALONG_FIRST_COORDINATE, false);
}
return toPlace;
}
return super.getStateForPlacement(context);
}
@Override
protected boolean hasStaticPart() {
return true;
}
@Override
public boolean isValidPosition(BlockState state, IWorldReader worldIn, BlockPos pos) {
Direction facing = state.get(FACING).getOpposite();
BlockPos neighbourPos = pos.offset(facing);
BlockState neighbour = worldIn.getBlockState(neighbourPos);
return Block.hasSolidSide(neighbour, worldIn, neighbourPos, facing.getOpposite());
}
@Override
public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos,
boolean isMoving) {
if (worldIn.isRemote)
return;
Direction blockFacing = state.get(FACING);
if (fromPos.equals(pos.offset(blockFacing.getOpposite()))) {
if (!isValidPosition(state, worldIn, pos)) {
worldIn.destroyBlock(pos, true);
return;
}
}
}
@Override
protected Direction getFacingForPlacement(BlockItemUseContext context) {
return context.getFace();

View file

@ -1,15 +1,13 @@
package com.simibubi.create.modules.contraptions.relays.gauge;
import java.util.List;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.base.KineticTileEntity;
import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation;
import net.minecraft.block.BlockState;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType;
import java.util.List;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType;
public class GaugeTileEntity extends KineticTileEntity implements IHaveGoggleInformation {

View file

@ -53,7 +53,7 @@ public class GaugeTileEntityRenderer extends KineticTileEntityRenderer {
@Override
protected BlockState getRenderedBlockState(KineticTileEntity te) {
return AllBlocks.SHAFT.block.getDefaultState().with(BlockStateProperties.AXIS,
return AllBlocks.SHAFT.get().getDefaultState().with(BlockStateProperties.AXIS,
((IRotate) te.getBlockState().getBlock()).getRotationAxis(te.getBlockState()));
}

View file

@ -1,5 +1,7 @@
package com.simibubi.create.modules.contraptions.relays.gauge;
import java.util.List;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.config.AllConfigs;
import com.simibubi.create.foundation.advancement.AllTriggers;
@ -11,8 +13,6 @@ import com.simibubi.create.modules.contraptions.base.IRotate.SpeedLevel;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.TextFormatting;
import java.util.List;
public class SpeedGaugeTileEntity extends GaugeTileEntity{
public SpeedGaugeTileEntity() {

View file

@ -1,14 +1,15 @@
package com.simibubi.create.modules.contraptions.relays.gauge;
import java.util.List;
import com.simibubi.create.AllTileEntities;
import com.simibubi.create.foundation.item.ItemDescription;
import com.simibubi.create.foundation.utility.ColorHelper;
import com.simibubi.create.foundation.utility.Lang;
import com.simibubi.create.modules.contraptions.base.IRotate.StressImpact;
import com.simibubi.create.modules.contraptions.goggle.IHaveGoggleInformation;
import net.minecraft.util.text.TextFormatting;
import java.util.List;
import net.minecraft.util.text.TextFormatting;
public class StressGaugeTileEntity extends GaugeTileEntity {
@ -17,8 +18,8 @@ public class StressGaugeTileEntity extends GaugeTileEntity {
}
@Override
public void updateStressFromNetwork(float maxStress, float currentStress) {
super.updateStressFromNetwork(maxStress, currentStress);
public void updateFromNetwork(float maxStress, float currentStress, int networkSize) {
super.updateFromNetwork(maxStress, currentStress, networkSize);
if (!StressImpact.isEnabled())
dialTarget = 0;
@ -50,7 +51,8 @@ public class StressGaugeTileEntity extends GaugeTileEntity {
markDirty();
return;
}
updateStressFromNetwork(capacity, stress);
updateFromNetwork(capacity, stress, getOrCreateNetwork().getSize());
}
@Override
@ -66,7 +68,8 @@ public class StressGaugeTileEntity extends GaugeTileEntity {
tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stress_gauge.title"));
if (getTheoreticalSpeed() == 0)
tooltip.add(TextFormatting.DARK_GRAY + ItemDescription.makeProgressBar(3, -1) + Lang.translate("gui.stress_gauge.no_rotation"));
tooltip.add(TextFormatting.DARK_GRAY + ItemDescription.makeProgressBar(3, -1)
+ Lang.translate("gui.stress_gauge.no_rotation"));
else {
tooltip.add(spacing + StressImpact.getFormattedStressText(stressFraction));
@ -75,10 +78,13 @@ public class StressGaugeTileEntity extends GaugeTileEntity {
double remainingCapacity = capacity - getNetworkStress();
double remainingCapacityAtBase = remainingCapacity / Math.abs(getTheoreticalSpeed());
String capacityString = spacing + StressImpact.of(stressFraction).getRelativeColor() + "%s" + Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s";
String capacityString = spacing + StressImpact.of(stressFraction).getRelativeColor() + "%s"
+ Lang.translate("generic.unit.stress") + " " + TextFormatting.DARK_GRAY + "%s";
tooltip.add(String.format(capacityString, IHaveGoggleInformation.format(remainingCapacityAtBase), Lang.translate("gui.goggles.base_value")));
tooltip.add(String.format(capacityString, IHaveGoggleInformation.format(remainingCapacity), Lang.translate("gui.goggles.at_current_speed")));
tooltip.add(String.format(capacityString, IHaveGoggleInformation.format(remainingCapacityAtBase),
Lang.translate("gui.goggles.base_value")));
tooltip.add(String.format(capacityString, IHaveGoggleInformation.format(remainingCapacity),
Lang.translate("gui.goggles.at_current_speed")));
}

View file

@ -25,10 +25,14 @@ import net.minecraft.particles.ParticleTypes;
import net.minecraft.tileentity.BeaconTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction;
import net.minecraft.util.math.*;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockPos.MutableBlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceContext.BlockMode;
import net.minecraft.util.math.RayTraceContext.FluidMode;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

View file

@ -32,7 +32,7 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber.Bus;
public class DeforesterItem extends AxeItem implements IHaveCustomItemModel {
public DeforesterItem(Properties builder) {
super(AllToolTiers.RADIANT, 10.0F, -3.1F, builder);
super(AllToolTiers.RADIANT, 5.0F, -3.1F, builder);
}
// Moved away from Item#onBlockDestroyed as it does not get called in Creative

View file

@ -85,7 +85,7 @@ public class CrossPlaneMirror extends SymmetryMirror {
@Override
public BlockState getModel() {
return AllBlocks.SYMMETRY_CROSSPLANE.block.getDefaultState().with(CrossPlaneSymmetryBlock.align,
return AllBlocks.SYMMETRY_CROSSPLANE.get().getDefaultState().with(CrossPlaneSymmetryBlock.align,
(Align) orientation);
}

View file

@ -81,7 +81,7 @@ public class PlaneMirror extends SymmetryMirror {
@Override
public BlockState getModel() {
return AllBlocks.SYMMETRY_PLANE.block.getDefaultState().with(PlaneSymmetryBlock.align, (Align) orientation);
return AllBlocks.SYMMETRY_PLANE.get().getDefaultState().with(PlaneSymmetryBlock.align, (Align) orientation);
}
@Override

View file

@ -43,7 +43,7 @@ public class TriplePlaneMirror extends SymmetryMirror {
@Override
public BlockState getModel() {
return AllBlocks.SYMMETRY_TRIPLEPLANE.block.getDefaultState();
return AllBlocks.SYMMETRY_TRIPLEPLANE.get().getDefaultState();
}
@Override

View file

@ -67,12 +67,16 @@ public class BlazingToolItem extends AbstractToolItem {
public void modifyDrops(Collection<ItemStack> drops, IWorld world, BlockPos pos, ItemStack tool, BlockState state) {
super.modifyDrops(drops, world, pos, tool, state);
World worldIn = world.getWorld();
helperFurnace.setWorld(worldIn);
RecipeManager recipeManager = worldIn.getRecipeManager();
int enchantmentLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, tool);
if (state == null)
enchantmentLevel = 0;
List<ItemStack> smeltedStacks = smeltDrops(drops, worldIn, enchantmentLevel);
drops.addAll(smeltedStacks);
}
public static List<ItemStack> smeltDrops(Collection<ItemStack> drops, World worldIn, int enchantmentLevel) {
helperFurnace.setWorld(worldIn);
RecipeManager recipeManager = worldIn.getRecipeManager();
List<ItemStack> smeltedStacks = new ArrayList<>();
Iterator<ItemStack> dropper = drops.iterator();
while (dropper.hasNext()) {
@ -87,13 +91,12 @@ public class BlazingToolItem extends AbstractToolItem {
float modifier = 1;
if (stack.getItem() instanceof BlockItem && !(out.getItem() instanceof BlockItem))
modifier += world.getRandom().nextFloat() * enchantmentLevel;
modifier += worldIn.getRandom().nextFloat() * enchantmentLevel;
out.setCount((int) (out.getCount() * modifier + .4f));
smeltedStacks.addAll(ItemHelper.multipliedOutput(stack, out));
}
drops.addAll(smeltedStacks);
return smeltedStacks;
}
@Override

View file

@ -113,7 +113,12 @@ public class SandPaperItem extends Item implements IHaveCustomItemModel {
public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) {
return enchantment == Enchantments.FORTUNE || super.canApplyAtEnchantingTable(stack, enchantment);
}
@Override
public int getItemEnchantability(ItemStack stack) {
return 1;
}
@Override
public ItemStack onItemUseFinish(ItemStack stack, World worldIn, LivingEntity entityLiving) {
if (!(entityLiving instanceof PlayerEntity))
@ -188,6 +193,11 @@ public class SandPaperItem extends Item implements IHaveCustomItemModel {
return 8;
}
@Override
public int getItemEnchantability() {
return 5;
}
@Override
@OnlyIn(Dist.CLIENT)
public CustomRenderedItemModel createModel(IBakedModel original) {

View file

@ -47,7 +47,7 @@ public class SandPaperPolishingRecipe extends ProcessingRecipe<SandPaperInv> {
return matchingRecipes.get(0).getCraftingResult(new SandPaperInv(stack)).copy();
if (stack.isDamageable() && isPolishingEnabled()) {
stack.setDamage(stack.getDamage() - (stack.getMaxDamage() - stack.getDamage()) / 2);
stack.setDamage(stack.getDamage() / 2);
int fortuneLevel = EnchantmentHelper.getEnchantmentLevel(Enchantments.FORTUNE, sandPaperStack);
float chanceToPunish = (float) (1 / Math.pow(2, fortuneLevel + 1));

Some files were not shown because too many files have changed in this diff Show more