ModernLifePatch/src-source/main/java/com/dairymoose/modernlife/blocks/EaselBlock.java
2024-10-26 09:40:21 +08:00

245 lines
13 KiB
Java

package com.dairymoose.modernlife.blocks;
import com.dairymoose.modernlife.blocks.gui.EaselScreen;
import com.dairymoose.modernlife.blocks.gui.EaselSizeScreen;
import com.dairymoose.modernlife.core.CustomBlocks;
import com.dairymoose.modernlife.core.ModernLifeClient;
import com.dairymoose.modernlife.core.ModernLifeCommon;
import com.dairymoose.modernlife.core.ModernLifeConfig;
import com.dairymoose.modernlife.tileentities.EaselBlockEntity;
import com.dairymoose.modernlife.util.ModernLifeUtil;
import java.util.List;
import javax.annotation.Nullable;
import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TextComponent;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.Container;
import net.minecraft.world.Containers;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.TooltipFlag;
import net.minecraft.world.item.context.BlockPlaceContext;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.EntityBlock;
import net.minecraft.world.level.block.Mirror;
import net.minecraft.world.level.block.Rotation;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.StateDefinition;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.world.level.material.Material;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.shapes.CollisionContext;
import net.minecraft.world.phys.shapes.VoxelShape;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor;
/* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/EaselBlock.class */
public class EaselBlock extends Block implements EntityBlock {
protected static final VoxelShape SHAPE_NORTH = Block.box(3.5d, 0.0d, 3.2d, 14.0d, 23.0d, 12.8d);
protected static final VoxelShape SHAPE_EAST = ModernLifeUtil.RotateVoxelShapeClockwise(SHAPE_NORTH);
protected static final VoxelShape SHAPE_SOUTH = ModernLifeUtil.RotateVoxelShapeClockwise(SHAPE_EAST);
protected static final VoxelShape SHAPE_WEST = ModernLifeUtil.RotateVoxelShapeClockwise(SHAPE_SOUTH);
public static final DirectionProperty FACING = BlockStateProperties.HORIZONTAL_FACING;
public static final BooleanProperty EMPTY = BooleanProperty.create("empty");
public EaselBlock() {
super(Properties.of(Material.WOOD).sound(SoundType.WOOD).strength(2.5f, 0.0f));
registerDefaultState((BlockState) ((BlockState) this.stateDefinition.any().setValue(FACING, Direction.NORTH)).setValue(EMPTY, Boolean.TRUE));
}
public BlockState rotate(BlockState state, Rotation rotation) {
return (BlockState) state.setValue(FACING, rotation.rotate(state.getValue(FACING)));
}
public BlockState mirror(BlockState state, Mirror mirror) {
return state.rotate(mirror.getRotation(state.getValue(FACING)));
}
public int getFlammability(BlockState state, BlockGetter world, BlockPos pos, Direction face) {
if (this.material.isFlammable()) {
return 20;
}
return 0;
}
public int getFireSpreadSpeed(BlockState state, BlockGetter world, BlockPos pos, Direction face) {
if (this.material.isFlammable()) {
return 5;
}
return 0;
}
@OnlyIn(Dist.CLIENT)
public void appendHoverText(ItemStack itemStack, @Nullable BlockGetter blockReader, List<Component> list, TooltipFlag tooltipFlag) {
list.add(new TextComponent("Place a canvas on it to begin painting"));
}
public boolean canSurvive(BlockState p_196260_1_, LevelReader p_196260_2_, BlockPos p_196260_3_) {
return (p_196260_2_.isEmptyBlock(p_196260_3_.below()) || p_196260_2_.getBlockState(p_196260_3_.below()).is(CustomBlocks.BLOCK_EASEL.get())) ? false : true;
}
public void onRemove(BlockState p_196243_1_, Level p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, boolean p_196243_5_) {
if (!p_196243_1_.is(p_196243_4_.getBlock())) {
Container blockEntity = (Container) p_196243_2_.getBlockEntity(p_196243_3_);
if (blockEntity != null) {
Containers.dropContents(p_196243_2_, p_196243_3_, blockEntity);
p_196243_2_.updateNeighbourForOutputSignal(p_196243_3_, this);
}
super.onRemove(p_196243_1_, p_196243_2_, p_196243_3_, p_196243_4_, p_196243_5_);
}
}
public InteractionResult use(BlockState p_225533_1_, Level p_225533_2_, BlockPos p_225533_3_, Player p_225533_4_, InteractionHand p_225533_5_, BlockHitResult p_225533_6_) {
if (p_225533_4_.getMainHandItem().getItem() == CustomBlocks.ITEM_CANVAS.get()) {
if (((Boolean) p_225533_1_.getValue(EMPTY)).booleanValue()) {
if (!p_225533_2_.isClientSide) {
BlockEntity tileEntity = p_225533_2_.getBlockEntity(p_225533_3_);
if (tileEntity instanceof EaselBlockEntity) {
EaselBlockEntity easelBlockEntity = (EaselBlockEntity) tileEntity;
if ((p_225533_2_ instanceof ServerLevel) && easelBlockEntity != null) {
easelBlockEntity.setItem(0, p_225533_4_.getMainHandItem().copy());
p_225533_4_.getMainHandItem().setCount(0);
BlockState newState = (BlockState) p_225533_1_.setValue(EMPTY, false);
p_225533_2_.setBlockAndUpdate(p_225533_3_, newState);
((ServerLevel) p_225533_2_).sendBlockUpdated(p_225533_3_, p_225533_1_, newState, 2);
}
}
}
return InteractionResult.CONSUME;
}
} else if (p_225533_4_.getMainHandItem().getItem() == Items.AIR && p_225533_4_.isSteppingCarefully()) {
if (!((Boolean) p_225533_1_.getValue(EMPTY)).booleanValue()) {
if (!p_225533_2_.isClientSide) {
BlockEntity tileEntity2 = p_225533_2_.getChunkAt(p_225533_3_).getBlockEntity(p_225533_3_);
ModernLifeCommon.LOGGER.debug("tileEntity = " + tileEntity2);
if (tileEntity2 instanceof EaselBlockEntity) {
EaselBlockEntity easelBlockEntity2 = (EaselBlockEntity) tileEntity2;
if ((p_225533_2_ instanceof ServerLevel) && easelBlockEntity2 != null) {
ItemStack canvasItem = easelBlockEntity2.getItem(0).copy();
easelBlockEntity2.setItem(0, ItemStack.EMPTY);
p_225533_2_.setBlockAndUpdate(p_225533_3_, (BlockState) p_225533_1_.setValue(EMPTY, true));
if (canvasItem != null) {
p_225533_4_.setItemInHand(InteractionHand.MAIN_HAND, canvasItem);
}
}
}
}
return InteractionResult.CONSUME;
}
} else if (!((Boolean) p_225533_1_.getValue(EMPTY)).booleanValue()) {
if (p_225533_2_.isClientSide) {
DistExecutor.runWhenOn(Dist.CLIENT, () -> {
return new Runnable() { // from class: com.dairymoose.modernlife.blocks.EaselBlock.1
@Override // java.lang.Runnable
public void run() {
EaselScreen screen = new EaselScreen(p_225533_2_, p_225533_3_);
BlockEntity tileEntity3 = p_225533_2_.getBlockEntity(p_225533_3_);
ModernLifeCommon.LOGGER.debug("tileEntity = " + tileEntity3);
if (tileEntity3 instanceof EaselBlockEntity) {
EaselBlockEntity easelBlockEntity3 = (EaselBlockEntity) tileEntity3;
ItemStack item = easelBlockEntity3.getItem(0);
ModernLifeCommon.LOGGER.debug("item = " + item);
if (item.getItem() == CustomBlocks.ITEM_CANVAS.get()) {
ModernLifeCommon.LOGGER.debug("canvas = " + tileEntity3);
if (item.hasTag() && item.getTag().contains("UniqueId")) {
long uniqueId = item.getTag().getLong("UniqueId");
byte[] imageData = ModernLifeClient.getCanvasData(uniqueId);
if (imageData != null && imageData.length > 0) {
int texW = ModernLifeClient.getCanvasWidth(uniqueId);
int texH = ModernLifeClient.getCanvasHeight(uniqueId);
screen.setTextureSize(texW, texH);
screen.setInitialData(imageData);
ModernLifeCommon.LOGGER.debug("initialData = " + imageData.length);
}
} else if (((Boolean) ModernLifeConfig.CLIENT.showEaselResolutionScreen.get()).booleanValue()) {
EaselSizeScreen sizeScreen = new EaselSizeScreen(p_225533_2_, p_225533_3_);
Minecraft.getInstance().setScreen(sizeScreen);
return;
} else {
ModernLifeCommon.LOGGER.debug("empty canvas size = " + ModernLifeConfig.CLIENT.emptyCanvasEaselSize.get());
screen.setTextureSize(((Integer) ModernLifeConfig.CLIENT.emptyCanvasEaselSize.get()).intValue(), ((Integer) ModernLifeConfig.CLIENT.emptyCanvasEaselSize.get()).intValue());
}
}
}
screen.setBlockPos(p_225533_3_);
Minecraft.getInstance().setScreen(screen);
}
};
});
}
return InteractionResult.CONSUME;
}
return InteractionResult.PASS;
}
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
EaselBlockEntity toReturn = (EaselBlockEntity) EaselBlockEntity.EASEL.create(pos, state);
return toReturn;
}
protected void createBlockStateDefinition(StateDefinition.Builder<Block, BlockState> builder) {
builder.add(new Property[]{FACING, EMPTY});
}
/* renamed from: com.dairymoose.modernlife.blocks.EaselBlock$2 */
/* loaded from: outputsrg.jar:com/dairymoose/modernlife/blocks/EaselBlock$2.class */
static /* synthetic */ class C00202 {
static final /* synthetic */ int[] $SwitchMap$net$minecraft$core$Direction = new int[Direction.values().length];
static {
try {
$SwitchMap$net$minecraft$core$Direction[Direction.NORTH.ordinal()] = 1;
} catch (NoSuchFieldError e) {
}
try {
$SwitchMap$net$minecraft$core$Direction[Direction.SOUTH.ordinal()] = 2;
} catch (NoSuchFieldError e2) {
}
try {
$SwitchMap$net$minecraft$core$Direction[Direction.EAST.ordinal()] = 3;
} catch (NoSuchFieldError e3) {
}
try {
$SwitchMap$net$minecraft$core$Direction[Direction.WEST.ordinal()] = 4;
} catch (NoSuchFieldError e4) {
}
}
}
public VoxelShape getShape(BlockState bs, BlockGetter reader, BlockPos pos, CollisionContext sel) {
switch (C00202.$SwitchMap$net$minecraft$core$Direction[bs.getValue(FACING).ordinal()]) {
case 1:
return SHAPE_NORTH;
case 2:
return SHAPE_SOUTH;
case 3:
return SHAPE_EAST;
case 4:
return SHAPE_WEST;
default:
return SHAPE_NORTH;
}
}
public BlockState getStateForPlacement(BlockPlaceContext context) {
return (BlockState) defaultBlockState().setValue(FACING, context.getHorizontalDirection());
}
}