added the automatic constructor

This commit is contained in:
Ellpeck 2019-01-08 01:14:19 +01:00
parent 3c2da1fb92
commit 15ba1675f0
12 changed files with 245 additions and 1 deletions

View file

@ -0,0 +1,43 @@
package de.ellpeck.naturesaura.blocks;
import de.ellpeck.naturesaura.blocks.tiles.TileEntityAutoCrafter;
import net.minecraft.block.BlockHorizontal;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.PropertyDirection;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class BlockAutoCrafter extends BlockContainerImpl {
public static final PropertyDirection FACING = BlockHorizontal.FACING;
public BlockAutoCrafter() {
super(Material.WOOD, "auto_crafter", TileEntityAutoCrafter.class, "auto_crafter");
this.setSoundType(SoundType.WOOD);
this.setHardness(1.5F);
}
@Override
protected BlockStateContainer createBlockState() {
return new BlockStateContainer(this, FACING);
}
@Override
public int getMetaFromState(IBlockState state) {
return state.getValue(FACING).getHorizontalIndex();
}
@Override
public IBlockState getStateFromMeta(int meta) {
return this.getDefaultState().withProperty(FACING, EnumFacing.byHorizontalIndex(meta));
}
@Override
public IBlockState getStateForPlacement(World worldIn, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) {
return this.getDefaultState().withProperty(FACING, placer.getHorizontalFacing());
}
}

View file

@ -41,4 +41,5 @@ public final class ModBlocks {
public static final Block END_FLOWER = new BlockEndFlower();
public static final Block GRATED_CHUTE = new BlockGratedChute();
public static final Block ANIMAL_SPAWNER = new BlockAnimalSpawner();
public static final Block AUTO_CRAFTER = new BlockAutoCrafter();
}

View file

@ -73,4 +73,12 @@ public final class Multiblocks {
'W', ModBlocks.ANCIENT_PLANKS,
'0', ModBlocks.ANIMAL_SPAWNER,
' ', Matcher.wildcard());
public static final IMultiblock AUTO_CRAFTER = NaturesAuraAPI.instance().createMultiblock(
new ResourceLocation(NaturesAura.MOD_ID, "auto_crafter"),
new String[][]{
{"PPPPPPP", "PLPLPLP", "PPPPPPP", "PLP0PLP", "PPPPPPP", "PLPLPLP", "PPPPPPP"}},
'P', ModBlocks.ANCIENT_PLANKS,
'L', ModBlocks.ANCIENT_LOG,
'0', ModBlocks.AUTO_CRAFTER,
' ', Matcher.wildcard());
}

View file

@ -0,0 +1,104 @@
package de.ellpeck.naturesaura.blocks.tiles;
import de.ellpeck.naturesaura.blocks.BlockAutoCrafter;
import de.ellpeck.naturesaura.blocks.multi.Multiblocks;
import de.ellpeck.naturesaura.packet.PacketHandler;
import de.ellpeck.naturesaura.packet.PacketParticles;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.util.EntitySelectors;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import java.util.List;
public class TileEntityAutoCrafter extends TileEntityImpl implements ITickable {
public final InventoryCrafting crafting = new InventoryCrafting(new Container() {
@Override
public boolean canInteractWith(EntityPlayer playerIn) {
return false;
}
}, 3, 3);
@Override
public void update() {
if (!this.world.isRemote) {
if (this.world.getTotalWorldTime() % 60 != 0)
return;
if (!Multiblocks.AUTO_CRAFTER.isComplete(this.world, this.pos))
return;
this.crafting.clear();
IBlockState state = this.world.getBlockState(this.pos);
EnumFacing facing = state.getValue(BlockAutoCrafter.FACING);
BlockPos middlePos = this.pos.up();
BlockPos topPos = middlePos.offset(facing, 2);
BlockPos bottomPos = middlePos.offset(facing.getOpposite(), 2);
BlockPos[] poses = new BlockPos[]{
topPos.offset(facing.rotateYCCW(), 2),
topPos,
topPos.offset(facing.rotateY(), 2),
middlePos.offset(facing.rotateYCCW(), 2),
middlePos,
middlePos.offset(facing.rotateY(), 2),
bottomPos.offset(facing.rotateYCCW(), 2),
bottomPos,
bottomPos.offset(facing.rotateY(), 2)
};
EntityItem[] items = new EntityItem[9];
for (int i = 0; i < poses.length; i++) {
List<EntityItem> entities = this.world.getEntitiesWithinAABB(
EntityItem.class, new AxisAlignedBB(poses[i]).grow(0.25), EntitySelectors.IS_ALIVE);
if (entities.size() > 1)
return;
if (entities.isEmpty())
continue;
EntityItem entity = entities.get(0);
if (entity.cannotPickup())
return;
ItemStack stack = entity.getItem();
if (stack.isEmpty())
return;
items[i] = entity;
this.crafting.setInventorySlotContents(i, stack.copy());
}
IRecipe recipe = CraftingManager.findMatchingRecipe(this.crafting, this.world);
if (recipe == null)
return;
ItemStack result = recipe.getCraftingResult(this.crafting);
if (result.isEmpty())
return;
EntityItem resultItem = new EntityItem(this.world,
this.pos.getX() + 0.5F, this.pos.getY() - 0.35F, this.pos.getZ() + 0.5F, result.copy());
resultItem.motionX = resultItem.motionY = resultItem.motionZ = 0;
this.world.spawnEntity(resultItem);
for (EntityItem item : items) {
if (item == null)
continue;
ItemStack stack = item.getItem();
if (stack.getCount() <= 1)
item.setDead();
else {
stack.shrink(1);
item.setItem(stack);
}
PacketHandler.sendToAllAround(this.world, this.pos, 32,
new PacketParticles((float) item.posX, (float) item.posY, (float) item.posZ, 19));
}
}
}
}

View file

@ -312,7 +312,7 @@ public class PacketParticles implements IMessage {
world.rand.nextGaussian() * 0.01F,
color, 1.5F, 80, 0F, true, true);
break;
case 19: // Animal spawner
case 19: // Animal spawner, auto crafter
for (int i = world.rand.nextInt(20) + 10; i >= 0; i--)
NaturesAuraAPI.instance().spawnMagicParticle(
message.posX, message.posY + 0.5F, message.posZ,

View file

@ -0,0 +1,32 @@
{
"forge_marker": 1,
"defaults": {
"model": "minecraft:cube",
"textures": {
"particle": "naturesaura:blocks/auto_crafter",
"up": "naturesaura:blocks/auto_crafter_top",
"north": "#particle",
"east": "#particle",
"west": "#particle",
"down": "naturesaura:blocks/auto_crafter_bottom",
"south": "#particle"
},
"transform": "forge:default-block"
},
"variants": {
"normal": [{}],
"inventory": [{}],
"facing": {
"north": {},
"south": {
"y": 180
},
"west": {
"y": 270
},
"east": {
"y": 90
}
}
}
}

View file

@ -38,6 +38,7 @@ tile.naturesaura.animal_generator.name=Disentangler of Mortals
tile.naturesaura.end_flower.name=Rose of Oblivion
tile.naturesaura.grated_chute.name=Adept Hopper
tile.naturesaura.animal_spawner.name=Altar of Birthing
tile.naturesaura.auto_crafter.name=Automatic Constructor
item.naturesaura.eye.name=Environmental Eye
item.naturesaura.eye_improved.name=Environmental Ocular

View file

@ -0,0 +1,26 @@
{
"name": "Automatic Constructor",
"icon": "naturesaura:auto_crafter",
"category": "devices",
"advancement": "naturesaura:sky_ingot",
"pages": [
{
"type": "text",
"text": "A big part of any botanist's life is the $(thing)construction$() of items, specifically in a $(item)Crafting Table$(). This, however, can easily become tedious and time consuming, especially for recipes that are created and used on a regular basis. For this, the $(item)Automatic Constructor$() comes in handy: It will create, without the help of anyone required, any item that can regularly be made by crafting."
},
{
"type": "text",
"text": "To achieve this, first, the $(thing)structure$() on the following page has to be constructed with the $(item)Automatic Constructor$() in the center. When placed, the facing of the arrow indicates the $(thing)top of the recipe$(), as if pointing to the uppermost row of slots in a $(item)Crafting Table$(). The required ingredients then have to be dropped on the $(item)Ancient Logs$() in their normal configuration. Once in place, after a couple of seconds, the resulting item will drop out of $(thing)the bottom$() of the $(item)Automatic Constructor$()."
},
{
"type": "multiblock",
"multiblock_id": "naturesaura:auto_crafter",
"text": "Creating the structure required for the automatic crafting process"
},
{
"type": "crafting",
"text": "Creating the $(item)Automatic Constructor$()",
"recipe": "naturesaura:auto_crafter"
}
]
}

View file

@ -0,0 +1,29 @@
{
"type": "forge:ore_shaped",
"pattern": [
"AWA",
"ACA",
"ASA"
],
"key": {
"C": {
"item": "minecraft:crafting_table"
},
"S": {
"item": "naturesaura:sky_ingot"
},
"A": {
"item": "naturesaura:ancient_planks"
},
"W": {
"type": "minecraft:item_nbt",
"item": "naturesaura:aura_bottle",
"nbt": {
"stored_type": "naturesaura:end"
}
}
},
"result": {
"item": "naturesaura:auto_crafter"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 B