Scrollable Pulse Repeaters

- Kinetic blocks can now be harvested by axes and pickaxes
- Shafts have less obnoxious placement behaviour
- Fixed belts not dropping casings and shafts when broken
- Fixed belt tunnels not synchronizing properly
- Fixed blockzapper rendering strangely when no block is selected
- Funnels can now directly insert items that players activate it with
- Flexpeater -> Adjustable Repeater
- Added the Adjustable Pulse Repeater
This commit is contained in:
simibubi 2020-01-28 14:41:05 +01:00
parent 42d766bd2d
commit ad829cfea3
37 changed files with 389 additions and 125 deletions

View file

@ -189,6 +189,7 @@ public enum AllBlocks {
ENTITY_DETECTOR(new BeltObserverBlock()), ENTITY_DETECTOR(new BeltObserverBlock()),
PULSE_REPEATER(new PulseRepeaterBlock()), PULSE_REPEATER(new PulseRepeaterBlock()),
FLEXPEATER(new FlexpeaterBlock()), FLEXPEATER(new FlexpeaterBlock()),
FLEXPULSEPEATER(new FlexpeaterBlock()),
FLEXPEATER_INDICATOR(new RenderUtilityBlock()), FLEXPEATER_INDICATOR(new RenderUtilityBlock()),
__CURIOSITIES__(), __CURIOSITIES__(),

View file

@ -56,6 +56,7 @@ import com.simibubi.create.modules.logistics.block.StockswitchTileEntity;
import com.simibubi.create.modules.logistics.block.belts.BeltObserverTileEntity; import com.simibubi.create.modules.logistics.block.belts.BeltObserverTileEntity;
import com.simibubi.create.modules.logistics.block.belts.BeltObserverTileEntityRenderer; import com.simibubi.create.modules.logistics.block.belts.BeltObserverTileEntityRenderer;
import com.simibubi.create.modules.logistics.block.belts.FunnelTileEntity; import com.simibubi.create.modules.logistics.block.belts.FunnelTileEntity;
import com.simibubi.create.modules.logistics.block.diodes.FlexPulsepeaterTileEntity;
import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntity; import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntity;
import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntityRenderer; import com.simibubi.create.modules.logistics.block.diodes.FlexpeaterTileEntityRenderer;
import com.simibubi.create.modules.logistics.block.extractor.ExtractorTileEntity; import com.simibubi.create.modules.logistics.block.extractor.ExtractorTileEntity;
@ -129,6 +130,7 @@ public enum AllTileEntities {
BELT_FUNNEL(FunnelTileEntity::new, AllBlocks.BELT_FUNNEL, AllBlocks.VERTICAL_FUNNEL), BELT_FUNNEL(FunnelTileEntity::new, AllBlocks.BELT_FUNNEL, AllBlocks.VERTICAL_FUNNEL),
ENTITY_DETECTOR(BeltObserverTileEntity::new, AllBlocks.ENTITY_DETECTOR), ENTITY_DETECTOR(BeltObserverTileEntity::new, AllBlocks.ENTITY_DETECTOR),
FLEXPEATER(FlexpeaterTileEntity::new, AllBlocks.FLEXPEATER), FLEXPEATER(FlexpeaterTileEntity::new, AllBlocks.FLEXPEATER),
FLEXPULSEPEATER(FlexPulsepeaterTileEntity::new, AllBlocks.FLEXPULSEPEATER),
// Curiosities // Curiosities
WINDOW_IN_A_BLOCK(WindowInABlockTileEntity::new, AllBlocks.WINDOW_IN_A_BLOCK), WINDOW_IN_A_BLOCK(WindowInABlockTileEntity::new, AllBlocks.WINDOW_IN_A_BLOCK),

View file

@ -9,6 +9,9 @@ import com.simibubi.create.foundation.block.connected.StandardCTBehaviour;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader;
import net.minecraftforge.common.ToolType; import net.minecraftforge.common.ToolType;
public class CasingBlock extends Block implements IHaveConnectedTextures { public class CasingBlock extends Block implements IHaveConnectedTextures {
@ -20,9 +23,23 @@ public class CasingBlock extends Block implements IHaveConnectedTextures {
this.textureFrom = textureFrom; this.textureFrom = textureFrom;
} }
@Override
public ToolType getHarvestTool(BlockState state) {
return null;
}
@Override
public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) {
for (ToolType toolType : player.getHeldItemMainhand().getToolTypes()) {
if (isToolEffective(state, toolType))
return true;
}
return super.canHarvestBlock(state, world, pos, player);
}
@Override @Override
public boolean isToolEffective(BlockState state, ToolType tool) { public boolean isToolEffective(BlockState state, ToolType tool) {
return tool == ToolType.PICKAXE || tool == ToolType.AXE; return tool == ToolType.AXE || tool == ToolType.PICKAXE;
} }
@Override @Override

View file

@ -4,6 +4,7 @@ import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemUseContext; import net.minecraft.item.ItemUseContext;
import net.minecraft.util.ActionResultType; import net.minecraft.util.ActionResultType;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
@ -35,6 +36,7 @@ public class WrenchItem extends Item {
Block.getDrops(state, (ServerWorld) world, pos, world.getTileEntity(pos)).forEach(itemStack -> { Block.getDrops(state, (ServerWorld) world, pos, world.getTileEntity(pos)).forEach(itemStack -> {
player.inventory.placeItemBackInInventory(world, itemStack); player.inventory.placeItemBackInInventory(world, itemStack);
}); });
state.spawnAdditionalDrops(world, pos, ItemStack.EMPTY);
world.destroyBlock(pos, false); world.destroyBlock(pos, false);
} }
return ActionResultType.SUCCESS; return ActionResultType.SUCCESS;

View file

@ -7,6 +7,7 @@ import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.material.PushReaction; import net.minecraft.block.material.PushReaction;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.BlockRenderLayer;
@ -16,6 +17,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorld; import net.minecraft.world.IWorld;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.ToolType;
public abstract class KineticBlock extends Block implements IRotate { public abstract class KineticBlock extends Block implements IRotate {
@ -25,6 +27,25 @@ public abstract class KineticBlock extends Block implements IRotate {
super(properties); super(properties);
} }
@Override
public ToolType getHarvestTool(BlockState state) {
return null;
}
@Override
public boolean canHarvestBlock(BlockState state, IBlockReader world, BlockPos pos, PlayerEntity player) {
for (ToolType toolType : player.getHeldItemMainhand().getToolTypes()) {
if (isToolEffective(state, toolType))
return true;
}
return super.canHarvestBlock(state, world, pos, player);
}
@Override
public boolean isToolEffective(BlockState state, ToolType tool) {
return tool == ToolType.AXE || tool == ToolType.PICKAXE;
}
// IRotate // IRotate
@Override @Override

View file

@ -66,7 +66,11 @@ public abstract class RotatedPillarKineticBlock extends KineticBlock {
@Override @Override
public BlockState getStateForPlacement(BlockItemUseContext context) { public BlockState getStateForPlacement(BlockItemUseContext context) {
return this.getDefaultState().with(AXIS, context.getFace().getAxis()); Axis preferredAxis = getPreferredAxis(context);
if (preferredAxis != null)
return this.getDefaultState().with(AXIS, preferredAxis);
return this.getDefaultState().with(AXIS, context.isPlacerSneaking() ? context.getFace().getAxis()
: context.getNearestLookingDirection().getAxis());
} }
@Override @Override

View file

@ -86,6 +86,31 @@ public class BeltBlock extends HorizontalKineticBlock implements IHaveNoBlockIte
return state.get(CASING) ? Material.WOOD : Material.WOOL; return state.get(CASING) ? Material.WOOD : Material.WOOL;
} }
@SuppressWarnings("deprecation")
@Override
public List<ItemStack> getDrops(BlockState state, net.minecraft.world.storage.loot.LootContext.Builder builder) {
List<ItemStack> drops = super.getDrops(state, builder);
if (state.get(CASING))
drops.addAll(AllBlocks.BRASS_CASING.getDefault()
.getDrops(builder));
return drops;
}
@Override
public void spawnAdditionalDrops(BlockState state, World worldIn, BlockPos pos, ItemStack stack) {
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)
inv.eject(s);
}
});
}
@Override @Override
public boolean isFlammable(BlockState state, IBlockReader world, BlockPos pos, Direction face) { public boolean isFlammable(BlockState state, IBlockReader world, BlockPos pos, Direction face) {
return false; return false;
@ -304,22 +329,6 @@ public class BeltBlock extends HorizontalKineticBlock implements IHaveNoBlockIte
return state.get(CASING) && layer == getRenderLayer(); return state.get(CASING) && layer == getRenderLayer();
} }
@Override
public void onBlockHarvested(World worldIn, BlockPos pos, BlockState state, PlayerEntity player) {
withTileEntityDo(worldIn, pos, te -> {
if (worldIn.isRemote)
return;
if (te.hasPulley() && (player == null || !player.isCreative()))
Block.spawnDrops(AllBlocks.SHAFT.get().getDefaultState(), worldIn, pos);
if (te.isController()) {
BeltInventory inv = te.getInventory();
for (TransportedItemStack stack : inv.items)
inv.eject(stack);
}
});
super.onBlockHarvested(worldIn, pos, state, player);
}
@Override @Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) { public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
if (worldIn.isRemote) if (worldIn.isRemote)
@ -361,6 +370,8 @@ public class BeltBlock extends HorizontalKineticBlock implements IHaveNoBlockIte
te.setSource(null); te.setSource(null);
te.remove(); te.remove();
if (destroyedBlock.get(CASING))
Block.spawnAsEntity(worldIn, toDestroy, new ItemStack(AllBlocks.BRASS_CASING.get()));
if (te.hasPulley()) if (te.hasPulley())
worldIn.setBlockState(toDestroy, AllBlocks.SHAFT.get().getDefaultState() worldIn.setBlockState(toDestroy, AllBlocks.SHAFT.get().getDefaultState()
.with(BlockStateProperties.AXIS, getRotationAxis(destroyedBlock)), 3); .with(BlockStateProperties.AXIS, getRotationAxis(destroyedBlock)), 3);

View file

@ -145,7 +145,7 @@ public class BeltInventory {
} }
// Belt tunnels // Belt tunnels
if (!onClient) { {
int seg1 = (int) current.beltPosition; int seg1 = (int) current.beltPosition;
int seg2 = (int) nextOffset; int seg2 = (int) nextOffset;
if (!beltMovementPositive && nextOffset == 0) if (!beltMovementPositive && nextOffset == 0)
@ -154,10 +154,12 @@ public class BeltInventory {
if (stuckAtTunnel(seg2, current.stack, movementFacing)) { if (stuckAtTunnel(seg2, current.stack, movementFacing)) {
continue; continue;
} }
if (!onClient) {
flapTunnel(seg1, movementFacing, false); flapTunnel(seg1, movementFacing, false);
flapTunnel(seg2, movementFacing.getOpposite(), true); flapTunnel(seg2, movementFacing.getOpposite(), true);
} }
} }
}
// Apply Movement // Apply Movement
current.beltPosition += limitedMovement; current.beltPosition += limitedMovement;
@ -263,9 +265,7 @@ public class BeltInventory {
if (te == null || !(te instanceof BeltTunnelTileEntity)) if (te == null || !(te instanceof BeltTunnelTileEntity))
return false; return false;
Direction flapFacing = movementDirection; Direction flapFacing = movementDirection.getOpposite();
if (flapFacing.getAxis() == Axis.X)
flapFacing = flapFacing.getOpposite();
BeltTunnelTileEntity tunnel = (BeltTunnelTileEntity) te; BeltTunnelTileEntity tunnel = (BeltTunnelTileEntity) te;
if (!tunnel.flaps.containsKey(flapFacing)) if (!tunnel.flaps.containsKey(flapFacing))

View file

@ -102,6 +102,7 @@ public class BeltTunnelTileEntity extends SyncedTileEntity implements ITickableT
syncedFlaps.remove(face); syncedFlaps.remove(face);
else else
syncedFlaps.put(face, ItemStack.EMPTY); syncedFlaps.put(face, ItemStack.EMPTY);
markDirty(); markDirty();
sendData(); sendData();
return true; return true;

View file

@ -21,6 +21,7 @@ import net.minecraft.client.renderer.entity.PlayerRenderer;
import net.minecraft.client.renderer.model.ItemCameraTransforms; import net.minecraft.client.renderer.model.ItemCameraTransforms;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.item.ItemStack;
import net.minecraft.particles.ParticleTypes; import net.minecraft.particles.ParticleTypes;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.HandSide; import net.minecraft.util.HandSide;
@ -90,20 +91,6 @@ public class BlockzapperHandler {
return barrelPos; return barrelPos;
} }
// @SubscribeEvent(priority = EventPriority.HIGHEST)
// public static void onBlockBroken(BreakEvent event) {
// PlayerEntity player = event.getPlayer();
// if (player == null)
// return;
// if (!AllItems.PLACEMENT_HANDGUN.typeOf(player.getHeldItemMainhand()))
// return;
//
// if (event.getState().isNormalCube(player.world, event.getPos())) {
// player.getHeldItemMainhand().getTag().put("BlockUsed", NBTUtil.writeBlockState(event.getState()));
// }
// event.setCanceled(true);
// }
@SubscribeEvent @SubscribeEvent
public static void onClientTick(ClientTickEvent event) { public static void onClientTick(ClientTickEvent event) {
if (event.phase == Phase.START) if (event.phase == Phase.START)
@ -185,14 +172,17 @@ public class BlockzapperHandler {
@SubscribeEvent @SubscribeEvent
public static void onRenderPlayerHand(RenderSpecificHandEvent event) { public static void onRenderPlayerHand(RenderSpecificHandEvent event) {
if (AllItems.PLACEMENT_HANDGUN.typeOf(event.getItemStack())) { ItemStack heldItem = event.getItemStack();
if (!AllItems.PLACEMENT_HANDGUN.typeOf(heldItem))
return;
boolean idle = !heldItem.getOrCreateTag().contains("BlockUsed");
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
boolean rightHand = event.getHand() == Hand.MAIN_HAND ^ mc.player.getPrimaryHand() == HandSide.LEFT; boolean rightHand = event.getHand() == Hand.MAIN_HAND ^ mc.player.getPrimaryHand() == HandSide.LEFT;
GlStateManager.pushMatrix(); GlStateManager.pushMatrix();
float recoil = rightHand float recoil = rightHand ? MathHelper.lerp(event.getPartialTicks(), lastRightHandAnimation, rightHandAnimation)
? MathHelper.lerp(event.getPartialTicks(), lastRightHandAnimation, rightHandAnimation)
: MathHelper.lerp(event.getPartialTicks(), lastLeftHandAnimation, leftHandAnimation); : MathHelper.lerp(event.getPartialTicks(), lastLeftHandAnimation, leftHandAnimation);
float equipProgress = event.getEquipProgress(); float equipProgress = event.getEquipProgress();
@ -201,6 +191,8 @@ public class BlockzapperHandler {
equipProgress = 0; equipProgress = 0;
if (!rightHand && (leftHandAnimation > .01f || dontReequipLeft)) if (!rightHand && (leftHandAnimation > .01f || dontReequipLeft))
equipProgress = 0; equipProgress = 0;
if (idle)
equipProgress = 1 - event.getEquipProgress();
// Render arm // Render arm
float f = rightHand ? 1.0F : -1.0F; float f = rightHand ? 1.0F : -1.0F;
@ -244,7 +236,7 @@ public class BlockzapperHandler {
GlStateManager.rotatef(f * 5.0F, 0.0F, 1.0F, 0.0F); GlStateManager.rotatef(f * 5.0F, 0.0F, 1.0F, 0.0F);
FirstPersonRenderer firstPersonRenderer = mc.getFirstPersonRenderer(); FirstPersonRenderer firstPersonRenderer = mc.getFirstPersonRenderer();
firstPersonRenderer.renderItemSide(mc.player, event.getItemStack(), firstPersonRenderer.renderItemSide(mc.player, heldItem,
rightHand ? ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND rightHand ? ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND
: ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND, : ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND,
!rightHand); !rightHand);
@ -252,7 +244,6 @@ public class BlockzapperHandler {
event.setCanceled(true); event.setCanceled(true);
} }
}
public static void dontAnimateItem(Hand hand) { public static void dontAnimateItem(Hand hand) {
boolean rightHand = hand == Hand.MAIN_HAND ^ Minecraft.getInstance().player.getPrimaryHand() == HandSide.LEFT; boolean rightHand = hand == Hand.MAIN_HAND ^ Minecraft.getInstance().player.getPrimaryHand() == HandSide.LEFT;

View file

@ -16,13 +16,16 @@ import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
import net.minecraft.state.StateContainer.Builder; import net.minecraft.state.StateContainer.Builder;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; 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.ISelectionContext;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
@ -170,6 +173,24 @@ public class FunnelBlock extends AttachedLogisticalBlock implements IBeltAttachm
return process(te, transported, state); return process(te, transported, state);
} }
@Override
public boolean onBlockActivated(BlockState state, World worldIn, BlockPos pos, PlayerEntity player, Hand handIn,
BlockRayTraceResult hit) {
if (hit.getFace() == getBlockFacing(state).getOpposite()) {
if (!worldIn.isRemote)
withTileEntityDo(worldIn, pos, te -> {
ItemStack heldItem = player.getHeldItem(handIn).copy();
ItemStack remainder = te.tryToInsert(heldItem);
if (!ItemStack.areItemStacksEqual(remainder, heldItem))
player.setHeldItem(handIn, remainder);
});
return true;
}
return false;
}
public boolean process(BeltTileEntity belt, TransportedItemStack transported, BeltAttachmentState state) { public boolean process(BeltTileEntity belt, TransportedItemStack transported, BeltAttachmentState state) {
TileEntity te = belt.getWorld().getTileEntity(state.attachmentPos); TileEntity te = belt.getWorld().getTileEntity(state.attachmentPos);
if (te == null || !(te instanceof FunnelTileEntity)) if (te == null || !(te instanceof FunnelTileEntity))

View file

@ -0,0 +1,50 @@
package com.simibubi.create.modules.logistics.block.diodes;
import static com.simibubi.create.modules.logistics.block.diodes.FlexpeaterBlock.POWERING;
import static net.minecraft.block.RedstoneDiodeBlock.POWERED;
import com.simibubi.create.AllTileEntities;
public class FlexPulsepeaterTileEntity extends FlexpeaterTileEntity {
public FlexPulsepeaterTileEntity() {
super(AllTileEntities.FLEXPULSEPEATER.type);
}
@Override
public void tick() {
updateConfigurableValue();
boolean powered = getBlockState().get(POWERED);
boolean powering = getBlockState().get(POWERING);
boolean atMax = state >= maxState;
boolean isReset = state == 0;
if (!charging && powered && !atMax)
charging = true;
if (charging && atMax) {
if (powering) {
world.setBlockState(pos, getBlockState().with(POWERING, false));
charging = false;
return;
}
if (!powering && !world.isRemote)
world.setBlockState(pos, getBlockState().with(POWERING, true));
return;
}
if (!charging && powered)
return;
if (!charging && !isReset) {
if (!world.isRemote)
world.setBlockState(pos, getBlockState().with(POWERING, false));
state = 0;
return;
}
state += charging ? 1 : 0;
}
}

View file

@ -1,5 +1,6 @@
package com.simibubi.create.modules.logistics.block.diodes; package com.simibubi.create.modules.logistics.block.diodes;
import com.simibubi.create.AllBlocks;
import com.simibubi.create.foundation.block.IHaveScrollableValue; import com.simibubi.create.foundation.block.IHaveScrollableValue;
import com.simibubi.create.foundation.block.IWithTileEntity; import com.simibubi.create.foundation.block.IWithTileEntity;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
@ -41,7 +42,7 @@ public class FlexpeaterBlock extends RedstoneDiodeBlock
@Override @Override
public TileEntity createTileEntity(BlockState state, IBlockReader world) { public TileEntity createTileEntity(BlockState state, IBlockReader world) {
return new FlexpeaterTileEntity(); return AllBlocks.FLEXPEATER.get() == this ? new FlexpeaterTileEntity() : new FlexPulsepeaterTileEntity();
} }
@Override @Override

View file

@ -9,6 +9,7 @@ import com.simibubi.create.foundation.block.SyncedTileEntity;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableTileEntity { public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableTileEntity {
@ -21,7 +22,11 @@ public class FlexpeaterTileEntity extends SyncedTileEntity implements ITickableT
public boolean forceClientState; public boolean forceClientState;
public FlexpeaterTileEntity() { public FlexpeaterTileEntity() {
super(AllTileEntities.FLEXPEATER.type); this(AllTileEntities.FLEXPEATER.type);
}
protected FlexpeaterTileEntity(TileEntityType<?> type) {
super(type);
lastModified = -1; lastModified = -1;
maxState = newMaxState = 1; maxState = newMaxState = 1;
} }

View file

@ -1,24 +1,24 @@
{ {
"forge_marker": 1, "forge_marker": 1,
"variants": { "variants": {
"powered=false,powering=false,facing=north": { "model": "create:block/flexpeater", "y": 180 }, "powered=false,powering=false,facing=north": { "model": "create:block/repeaters/flexpeater", "y": 180 },
"powered=false,powering=false,facing=east": { "model": "create:block/flexpeater", "y": 270 }, "powered=false,powering=false,facing=east": { "model": "create:block/repeaters/flexpeater", "y": 270 },
"powered=false,powering=false,facing=south": { "model": "create:block/flexpeater", "y": 0 }, "powered=false,powering=false,facing=south": { "model": "create:block/repeaters/flexpeater", "y": 0 },
"powered=false,powering=false,facing=west": { "model": "create:block/flexpeater", "y": 90 }, "powered=false,powering=false,facing=west": { "model": "create:block/repeaters/flexpeater", "y": 90 },
"powered=true,powering=false,facing=north": { "model": "create:block/flexpeater_powered", "y": 180 }, "powered=true,powering=false,facing=north": { "model": "create:block/repeaters/flexpeater_powered", "y": 180 },
"powered=true,powering=false,facing=east": { "model": "create:block/flexpeater_powered", "y": 270 }, "powered=true,powering=false,facing=east": { "model": "create:block/repeaters/flexpeater_powered", "y": 270 },
"powered=true,powering=false,facing=south": { "model": "create:block/flexpeater_powered", "y": 0 }, "powered=true,powering=false,facing=south": { "model": "create:block/repeaters/flexpeater_powered", "y": 0 },
"powered=true,powering=false,facing=west": { "model": "create:block/flexpeater_powered", "y": 90 }, "powered=true,powering=false,facing=west": { "model": "create:block/repeaters/flexpeater_powered", "y": 90 },
"powered=false,powering=true,facing=north": { "model": "create:block/flexpeater_powering", "y": 180 }, "powered=false,powering=true,facing=north": { "model": "create:block/repeaters/flexpeater_powering", "y": 180 },
"powered=false,powering=true,facing=east": { "model": "create:block/flexpeater_powering", "y": 270 }, "powered=false,powering=true,facing=east": { "model": "create:block/repeaters/flexpeater_powering", "y": 270 },
"powered=false,powering=true,facing=south": { "model": "create:block/flexpeater_powering", "y": 0 }, "powered=false,powering=true,facing=south": { "model": "create:block/repeaters/flexpeater_powering", "y": 0 },
"powered=false,powering=true,facing=west": { "model": "create:block/flexpeater_powering", "y": 90 }, "powered=false,powering=true,facing=west": { "model": "create:block/repeaters/flexpeater_powering", "y": 90 },
"powered=true,powering=true,facing=north": { "model": "create:block/flexpeater_powered_powering", "y": 180 }, "powered=true,powering=true,facing=north": { "model": "create:block/repeaters/flexpeater_powered_powering", "y": 180 },
"powered=true,powering=true,facing=east": { "model": "create:block/flexpeater_powered_powering", "y": 270 }, "powered=true,powering=true,facing=east": { "model": "create:block/repeaters/flexpeater_powered_powering", "y": 270 },
"powered=true,powering=true,facing=south": { "model": "create:block/flexpeater_powered_powering", "y": 0 }, "powered=true,powering=true,facing=south": { "model": "create:block/repeaters/flexpeater_powered_powering", "y": 0 },
"powered=true,powering=true,facing=west": { "model": "create:block/flexpeater_powered_powering", "y": 90 } "powered=true,powering=true,facing=west": { "model": "create:block/repeaters/flexpeater_powered_powering", "y": 90 }
} }
} }

View file

@ -1,5 +1,5 @@
{ {
"variants": { "variants": {
"": { "model": "create:block/flexpeater_indicator" } "": { "model": "create:block/repeaters/flexpeater_indicator" }
} }
} }

View file

@ -0,0 +1,24 @@
{
"forge_marker": 1,
"variants": {
"powered=false,powering=false,facing=north": { "model": "create:block/repeaters/flexpulsepeater", "y": 180 },
"powered=false,powering=false,facing=east": { "model": "create:block/repeaters/flexpulsepeater", "y": 270 },
"powered=false,powering=false,facing=south": { "model": "create:block/repeaters/flexpulsepeater", "y": 0 },
"powered=false,powering=false,facing=west": { "model": "create:block/repeaters/flexpulsepeater", "y": 90 },
"powered=true,powering=false,facing=north": { "model": "create:block/repeaters/flexpulsepeater_powered", "y": 180 },
"powered=true,powering=false,facing=east": { "model": "create:block/repeaters/flexpulsepeater_powered", "y": 270 },
"powered=true,powering=false,facing=south": { "model": "create:block/repeaters/flexpulsepeater_powered", "y": 0 },
"powered=true,powering=false,facing=west": { "model": "create:block/repeaters/flexpulsepeater_powered", "y": 90 },
"powered=false,powering=true,facing=north": { "model": "create:block/repeaters/flexpulsepeater_powering", "y": 180 },
"powered=false,powering=true,facing=east": { "model": "create:block/repeaters/flexpulsepeater_powering", "y": 270 },
"powered=false,powering=true,facing=south": { "model": "create:block/repeaters/flexpulsepeater_powering", "y": 0 },
"powered=false,powering=true,facing=west": { "model": "create:block/repeaters/flexpulsepeater_powering", "y": 90 },
"powered=true,powering=true,facing=north": { "model": "create:block/repeaters/flexpulsepeater_powered_powering", "y": 180 },
"powered=true,powering=true,facing=east": { "model": "create:block/repeaters/flexpulsepeater_powered_powering", "y": 270 },
"powered=true,powering=true,facing=south": { "model": "create:block/repeaters/flexpulsepeater_powered_powering", "y": 0 },
"powered=true,powering=true,facing=west": { "model": "create:block/repeaters/flexpulsepeater_powered_powering", "y": 90 }
}
}

View file

@ -122,7 +122,8 @@
"block.create.transposer": "Transposer", "block.create.transposer": "Transposer",
"block.create.linked_transposer": "Linked Transposer", "block.create.linked_transposer": "Linked Transposer",
"block.create.pulse_repeater": "Pulse Repeater", "block.create.pulse_repeater": "Pulse Repeater",
"block.create.flexpeater": "FlexPeater", "block.create.flexpulsepeater": "Adjustable Pulse Repeater",
"block.create.flexpeater": "Adjustable Repeater",
"block.create.entity_detector": "Belt Observer", "block.create.entity_detector": "Belt Observer",
"block.create.logistical_casing": "Logistical Casing", "block.create.logistical_casing": "Logistical Casing",
"block.create.logistical_controller": "Logistical Controller", "block.create.logistical_controller": "Logistical Controller",

View file

@ -0,0 +1,37 @@
{
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"parent": "block/block",
"textures": {
"flexpeater_off": "create:block/flexpeater_off",
"torch": "minecraft:block/redstone_torch_off",
"smooth_stone": "minecraft:block/smooth_stone",
"particle": "create:block/flexpeater_off"
},
"elements": [
{
"name": "Top",
"from": [ 5, 2.1, 5 ],
"to": [ 11, 3.1, 11 ],
"faces": {
"north": { "texture": "#flexpeater_off", "uv": [ 5, 5, 11, 6 ], "rotation": 180 },
"east": { "texture": "#flexpeater_off", "uv": [ 10, 5, 11, 11 ], "rotation": 90 },
"south": { "texture": "#flexpeater_off", "uv": [ 5, 10, 11, 11 ] },
"west": { "texture": "#flexpeater_off", "uv": [ 5, 11, 6, 5 ], "rotation": 90 },
"up": { "texture": "#flexpeater_off", "uv": [ 5, 5, 11, 11 ] }
}
},
{
"name": "circuit",
"from": [ 0, 0, 0 ],
"to": [ 16, 2, 16 ],
"faces": {
"north": { "texture": "#smooth_stone", "uv": [ 0, 0, 16, 2 ] },
"east": { "texture": "#smooth_stone", "uv": [ 0, 0, 16, 2 ] },
"south": { "texture": "#smooth_stone", "uv": [ 0, 0, 16, 2 ] },
"west": { "texture": "#smooth_stone", "uv": [ 0, 0, 16, 2 ] },
"up": { "texture": "#flexpeater_off", "uv": [ 0, 0, 16, 16 ] },
"down": { "texture": "#smooth_stone", "uv": [ 0, 0, 16, 16 ] }
}
}
]
}

View file

@ -1,5 +1,5 @@
{ {
"parent": "create:block/flexpeater", "parent": "create:block/repeaters/flexpeater",
"textures": { "textures": {
"flexpeater_off": "create:block/flexpeater_on", "flexpeater_off": "create:block/flexpeater_on",
"particle": "create:block/flexpeater_on" "particle": "create:block/flexpeater_on"

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/repeaters/flexpeater_powered",
"textures": {
"torch": "minecraft:block/redstone_torch"
}
}

View file

@ -1,5 +1,5 @@
{ {
"parent": "create:block/flexpeater", "parent": "create:block/repeaters/flexpeater",
"textures": { "textures": {
"torch": "minecraft:block/redstone_torch" "torch": "minecraft:block/redstone_torch"
} }

View file

@ -2,10 +2,10 @@
"__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)", "__comment": "Model generated using MrCrayfish's Model Creator (https://mrcrayfish.com/tools?id=mc)",
"parent": "block/block", "parent": "block/block",
"textures": { "textures": {
"flexpeater_off": "create:block/flexpeater_off", "flexpeater_off": "create:block/flexpulsepeater_off",
"torch": "minecraft:block/redstone_torch_off", "torch": "minecraft:block/redstone_torch_off",
"smooth_stone": "minecraft:block/smooth_stone", "smooth_stone": "minecraft:block/smooth_stone",
"particle": "create:block/flexpeater_off" "particle": "create:block/flexpulsepeater_off"
}, },
"elements": [ "elements": [
{ {

View file

@ -0,0 +1,7 @@
{
"parent": "create:block/repeaters/flexpulsepeater",
"textures": {
"flexpeater_off": "create:block/flexpulsepeater_on",
"particle": "create:block/flexpulsepeater_on"
}
}

View file

@ -0,0 +1,6 @@
{
"parent": "create:block/repeaters/flexpulsepeater_powered",
"textures": {
"torch": "minecraft:block/redstone_torch"
}
}

View file

@ -1,5 +1,5 @@
{ {
"parent": "create:block/flexpeater_powered", "parent": "create:block/repeaters/flexpulsepeater",
"textures": { "textures": {
"torch": "minecraft:block/redstone_torch" "torch": "minecraft:block/redstone_torch"
} }

View file

@ -1,5 +1,5 @@
{ {
"parent": "create:block/flexpeater", "parent": "create:block/repeaters/flexpeater",
"textures": { "textures": {
"flexpeater_off": "create:block/flexpeater_item" "flexpeater_off": "create:block/flexpeater_item"
}, },

View file

@ -0,0 +1,13 @@
{
"parent": "create:block/repeaters/flexpulsepeater",
"textures": {
"flexpeater_off": "create:block/flexpulsepeater_item"
},
"display": {
"fixed": {
"rotation": [ 270, 0, 0 ],
"translation": [ 0, 0, -3],
"scale":[ 0.5, 0.5, 0.5 ]
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 B

After

Width:  |  Height:  |  Size: 524 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 526 B

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 B

After

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

View file

@ -0,0 +1,19 @@
{
"type": "minecraft:block",
"pools": [
{
"rolls": 1,
"entries": [
{
"type": "minecraft:item",
"name": "create:flexpulsepeater"
}
],
"conditions": [
{
"condition": "minecraft:survives_explosion"
}
]
}
]
}

View file

@ -0,0 +1,24 @@
{
"type": "crafting_shaped",
"pattern": [
"SP"
],
"key": {
"P": {
"item": "create:flexpeater"
},
"S": {
"item": "create:pulse_repeater"
}
},
"result": {
"item": "create:flexpulsepeater",
"count": 1
},
"conditions": [
{
"type": "create:module",
"module": "logistics"
}
]
}