190 lines
5.0 KiB
Java
190 lines
5.0 KiB
Java
package com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_19_R3;
|
|
|
|
import com.google.common.base.Suppliers;
|
|
import com.sk89q.jnbt.CompoundTag;
|
|
import com.sk89q.util.ReflectionUtil;
|
|
import com.sk89q.worldedit.bukkit.adapter.Refraction;
|
|
import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_19_R3.nbt.PaperweightLazyCompoundTag;
|
|
import com.sk89q.worldedit.world.registry.BlockMaterial;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.world.level.EmptyBlockGetter;
|
|
import net.minecraft.world.level.block.Block;
|
|
import net.minecraft.world.level.block.EntityBlock;
|
|
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.material.Material;
|
|
import net.minecraft.world.level.material.PushReaction;
|
|
import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData;
|
|
|
|
public class PaperweightBlockMaterial implements BlockMaterial {
|
|
|
|
private final Block block;
|
|
private final BlockState blockState;
|
|
private final Material material;
|
|
private final boolean isTranslucent;
|
|
private final CraftBlockData craftBlockData;
|
|
private final org.bukkit.Material craftMaterial;
|
|
private final int opacity;
|
|
private final CompoundTag tile;
|
|
|
|
public PaperweightBlockMaterial(Block block) {
|
|
this(block, block.defaultBlockState());
|
|
}
|
|
|
|
public PaperweightBlockMaterial(Block block, BlockState blockState) {
|
|
this.block = block;
|
|
this.blockState = blockState;
|
|
this.material = blockState.getMaterial();
|
|
this.craftBlockData = CraftBlockData.fromData(blockState);
|
|
this.craftMaterial = craftBlockData.getMaterial();
|
|
BlockBehaviour.Properties blockInfo = ReflectionUtil.getField(BlockBehaviour.class, block,
|
|
Refraction.pickName("properties", "aP"));
|
|
this.isTranslucent = !(boolean) ReflectionUtil.getField(BlockBehaviour.Properties.class, blockInfo,
|
|
Refraction.pickName("canOcclude", "n")
|
|
);
|
|
opacity = blockState.getLightBlock(EmptyBlockGetter.INSTANCE, BlockPos.ZERO);
|
|
BlockEntity tileEntity = !(block instanceof EntityBlock) ? null : ((EntityBlock) block).newBlockEntity(
|
|
BlockPos.ZERO,
|
|
blockState
|
|
);
|
|
tile = tileEntity == null
|
|
? null
|
|
: new PaperweightLazyCompoundTag(Suppliers.memoize(tileEntity::saveWithId));
|
|
}
|
|
|
|
public Block getBlock() {
|
|
return block;
|
|
}
|
|
|
|
public BlockState getState() {
|
|
return blockState;
|
|
}
|
|
|
|
public CraftBlockData getCraftBlockData() {
|
|
return craftBlockData;
|
|
}
|
|
|
|
public Material getMaterial() {
|
|
return material;
|
|
}
|
|
|
|
@Override
|
|
public boolean isAir() {
|
|
return blockState.isAir();
|
|
}
|
|
|
|
@Override
|
|
public boolean isFullCube() {
|
|
return craftMaterial.isOccluding();
|
|
}
|
|
|
|
@Override
|
|
public boolean isOpaque() {
|
|
return material.isSolidBlocking();
|
|
}
|
|
|
|
@Override
|
|
public boolean isPowerSource() {
|
|
return blockState.isSignalSource();
|
|
}
|
|
|
|
@Override
|
|
public boolean isLiquid() {
|
|
return material.isLiquid();
|
|
}
|
|
|
|
@Override
|
|
public boolean isSolid() {
|
|
return material.isSolid();
|
|
}
|
|
|
|
@Override
|
|
public float getHardness() {
|
|
return craftBlockData.getState().destroySpeed;
|
|
}
|
|
|
|
@Override
|
|
public float getResistance() {
|
|
return block.getExplosionResistance();
|
|
}
|
|
|
|
@Override
|
|
public float getSlipperiness() {
|
|
return block.getFriction();
|
|
}
|
|
|
|
@Override
|
|
public int getLightValue() {
|
|
return blockState.getLightEmission();
|
|
}
|
|
|
|
@Override
|
|
public int getLightOpacity() {
|
|
return opacity;
|
|
}
|
|
|
|
@Override
|
|
public boolean isFragileWhenPushed() {
|
|
return material.getPushReaction() == PushReaction.DESTROY;
|
|
}
|
|
|
|
@Override
|
|
public boolean isUnpushable() {
|
|
return material.getPushReaction() == PushReaction.BLOCK;
|
|
}
|
|
|
|
@Override
|
|
public boolean isTicksRandomly() {
|
|
return block.isRandomlyTicking(blockState);
|
|
}
|
|
|
|
@Override
|
|
public boolean isMovementBlocker() {
|
|
return material.isSolid();
|
|
}
|
|
|
|
@Override
|
|
public boolean isBurnable() {
|
|
return material.isFlammable();
|
|
}
|
|
|
|
@Override
|
|
public boolean isToolRequired() {
|
|
// Removed in 1.16.1, this is not present in higher versions
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean isReplacedDuringPlacement() {
|
|
return material.isReplaceable();
|
|
}
|
|
|
|
@Override
|
|
public boolean isTranslucent() {
|
|
return isTranslucent;
|
|
}
|
|
|
|
@Override
|
|
public boolean hasContainer() {
|
|
return block instanceof EntityBlock;
|
|
}
|
|
|
|
@Override
|
|
public boolean isTile() {
|
|
return block instanceof EntityBlock;
|
|
}
|
|
|
|
@Override
|
|
public CompoundTag getDefaultTile() {
|
|
return tile;
|
|
}
|
|
|
|
@Override
|
|
public int getMapColor() {
|
|
// rgb field
|
|
return material.getColor().col;
|
|
}
|
|
|
|
}
|