Java源码示例:net.minecraft.client.renderer.BlockModelShapes
示例1
@OnlyIn (Dist.CLIENT)
public static boolean handleRunningEffects(World world, BlockPos pos, BlockState state, Entity entity) {
//Spoof a raytrace from the feet.
BlockRayTraceResult traceResult = new BlockRayTraceResult(entity.getPositionVec().add(0, 1, 0), Direction.UP, pos, false);
BlockModelShapes modelShapes = Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes();
IBakedModel model = modelShapes.getModel(state);
if (model instanceof IModelParticleProvider) {
IModelData modelData = ModelDataManager.getModelData(world, pos);
ParticleManager particleManager = Minecraft.getInstance().particles;
List<TextureAtlasSprite> sprites = new ArrayList<>(((IModelParticleProvider) model).getHitEffects(traceResult, state, world, pos, modelData));
TextureAtlasSprite rolledSprite = sprites.get(world.rand.nextInt(sprites.size()));
double x = entity.getPosX() + (world.rand.nextFloat() - 0.5D) * entity.getWidth();
double y = entity.getBoundingBox().minY + 0.1D;
double z = entity.getPosZ() + (world.rand.nextFloat() - 0.5D) * entity.getWidth();
particleManager.addEffect(new CustomBreakingParticle(world, x, y, z, -entity.getMotion().x * 4.0D, 1.5D, -entity.getMotion().z * 4.0D, rolledSprite));
return true;
}
return false;
}
示例2
@OnlyIn (Dist.CLIENT)
public static void addLandingEffects(World world, BlockPos pos, BlockState state, Vector3 entityPos, int numParticles) {
//Spoof a raytrace from the feet.
BlockRayTraceResult traceResult = new BlockRayTraceResult(new Vec3d(entityPos.x, pos.getY() + 1, entityPos.z), Direction.UP, pos, false);
ParticleManager manager = Minecraft.getInstance().particles;
Random randy = new Random();
BlockModelShapes modelShapes = Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes();
IBakedModel model = modelShapes.getModel(state);
if (model instanceof IModelParticleProvider) {
IModelData modelData = ModelDataManager.getModelData(world, pos);
List<TextureAtlasSprite> sprites = new ArrayList<>(((IModelParticleProvider) model).getHitEffects(traceResult, state, world, pos, modelData));
double speed = 0.15000000596046448D;
if (numParticles != 0) {
for (int i = 0; i < numParticles; i++) {
double mX = randy.nextGaussian() * speed;
double mY = randy.nextGaussian() * speed;
double mZ = randy.nextGaussian() * speed;
manager.addEffect(CustomBreakingParticle.newLandingParticle(world, entityPos.x, entityPos.y, entityPos.z, mX, mY, mZ, sprites.get(randy.nextInt(sprites.size()))));
}
}
}
}
示例3
public void renderWaterLevel(HydroponicTileEntity tileEntity, double x, double y, double z, float partialTicks,
int destroyStage, float partial, BufferBuilder buffer) {
final float PX = 1f / 16f;
final float YOFF = 12 * PX;
final float BORDER = 1f * PX;
final float MAXHEIGHT = 2 * PX;
boolean hasWater = tileEntity.fluidHandler.getFluidAmount() > 0;
if (!hasWater) {
return;
}
float actualHeight = MAXHEIGHT + YOFF;
BlockModelShapes bm = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes();
IBlockState blockState = tileEntity.fluidHandler.getFluid().getFluid().getBlock().getDefaultState();
TextureAtlasSprite texture = bm.getTexture(blockState);
// Lightmap calculations
int upCombined = getWorld().getCombinedLight(tileEntity.getPos().up(), 0);
int upLMa = upCombined >> 16 & 65535;
int upLMb = upCombined & 65535;
buffer.setTranslation(x, y, z);
// UP face
buffer.pos(BORDER, actualHeight, BORDER).color(1f, 1f, 1f, 0.8f).tex(texture.getMinU(), texture.getMinV())
.lightmap(upLMa, upLMb).endVertex();
buffer.pos(1 - BORDER, actualHeight, BORDER).color(1f, 1f, 1f, 0.8f).tex(texture.getMaxU(), texture.getMinV())
.lightmap(upLMa, upLMb).endVertex();
buffer.pos(1 - BORDER, actualHeight, 1 - BORDER).color(1f, 1f, 1f, 0.8f)
.tex(texture.getMaxU(), texture.getMaxV()).lightmap(upLMa, upLMb).endVertex();
buffer.pos(BORDER, actualHeight, 1 - BORDER).color(1f, 1f, 1f, 0.8f).tex(texture.getMinU(), texture.getMaxV())
.lightmap(upLMa, upLMb).endVertex();
}
示例4
public void renderGrowthMedium(HydroponicTileEntity tileEntity, double x, double y, double z, float partialTicks,
int destroyStage, float partial, BufferBuilder buffer) {
// I was hella lazy here, could be improved
final float PX = 1f / 16f;
final float YOFF = 12 * PX;
final float BORDER = 6f * PX;
final float MAXHEIGHT = 4 * PX;
float actualHeight = MAXHEIGHT + YOFF;
TextureAtlasSprite containerTexture = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(CONTAINER_TEXTURE);
TextureAtlasSprite texture = containerTexture;
int mediumId = tileEntity.getGrowthMediumId();
if (mediumId > 0) {
IBlockState growthMediaBlockState = HydroponicHelper.getMediumBlockStateFromId(mediumId);
BlockModelShapes bm = Minecraft.getMinecraft().getBlockRendererDispatcher().getBlockModelShapes();
texture = bm.getTexture(growthMediaBlockState);
}
// Lightmap calculations
int upCombined = getWorld().getCombinedLight(tileEntity.getPos().up(), 0);
int upLMa = upCombined >> 16 & 65535;
int upLMb = upCombined & 65535;
buffer.setTranslation(x,y,z);
//UP face
buffer.pos(BORDER, actualHeight, BORDER).color(1f,1f,1f,1f).tex(texture.getMinU(), texture.getMinV()).lightmap(upLMa,upLMb).endVertex();
buffer.pos(1 - BORDER, actualHeight, BORDER).color(1f,1f,1f,1f).tex(texture.getMaxU(), texture.getMinV()).lightmap(upLMa,upLMb).endVertex();
buffer.pos(1 - BORDER, actualHeight, 1 - BORDER).color(1f,1f,1f,1f).tex(texture.getMaxU(), texture.getMaxV()).lightmap(upLMa,upLMb).endVertex();
buffer.pos(BORDER, actualHeight, 1 - BORDER).color(1f,1f,1f,1f).tex(texture.getMinU(), texture.getMaxV()).lightmap(upLMa,upLMb).endVertex();
}
示例5
/**
* {@link Block#addHitEffects}
* Provided the model bound is an instance of IModelParticleProvider, you will have landing particles just handled for you.
* Use the default PerspectiveModel implementations inside CCL, Destroy effects will just be handled for you.
*
* @param world The world.
* @param pos The position of the block.
* @param manager The ParticleManager.
* @return True if particles were added, basically just return the result of this method inside {@link Block#addHitEffects}
*/
@OnlyIn (Dist.CLIENT)
public static boolean handleDestroyEffects(World world, BlockPos pos, BlockState state, ParticleManager manager) {
BlockModelShapes modelShapes = Minecraft.getInstance().getBlockRendererDispatcher().getBlockModelShapes();
IBakedModel model = modelShapes.getModel(state);
if (model instanceof IModelParticleProvider) {
IModelData modelData = ModelDataManager.getModelData(world, pos);
Cuboid6 bounds = new Cuboid6(state.getShape(world, pos).getBoundingBox());
addBlockDestroyEffects(world, bounds.add(pos), new ArrayList<>(((IModelParticleProvider) model).getDestroyEffects(state, world, pos, modelData)), manager);
return true;
}
return false;
}
示例6
public void render(int x, int y, int zLevel, Minecraft mc)
{
if (this.stateExpected != null && this.stateFound != null)
{
GlStateManager.pushMatrix();
int x1 = x + 10;
int x2 = x + this.columnWidthExpected + 30;
RenderUtils.drawOutlinedBox(x, y, this.totalWidth, this.totalHeight, 0xFF000000, GuiBase.COLOR_HORIZONTAL_BAR, zLevel);
RenderUtils.drawRect(x1, y + 16, 16, 16, 0x50C0C0C0, zLevel); // light background for the item
RenderUtils.drawRect(x2, y + 16, 16, 16, 0x50C0C0C0, zLevel); // light background for the item
FontRenderer textRenderer = mc.fontRenderer;
String pre = GuiBase.TXT_WHITE + GuiBase.TXT_BOLD;
String strExpected = pre + StringUtils.translate("litematica.gui.label.schematic_verifier.expected") + GuiBase.TXT_RST;
String strFound = pre + StringUtils.translate("litematica.gui.label.schematic_verifier.found") + GuiBase.TXT_RST;
GlStateManager.translate(0f, 0f, zLevel + 0.1f);
y += 4;
textRenderer.drawString(strExpected, x1, y, 0xFFFFFFFF);
textRenderer.drawString(strFound, x2, y, 0xFFFFFFFF);
y += 12;
GlStateManager.disableLighting();
RenderUtils.enableGuiItemLighting();
boolean useBlockModelConfig = Configs.Visuals.SCHEMATIC_VERIFIER_BLOCK_MODELS.getBooleanValue();
boolean hasModelExpected = this.stateExpected.getRenderType() == EnumBlockRenderType.MODEL;
boolean hasModelFound = this.stateFound.getRenderType() == EnumBlockRenderType.MODEL;
boolean isAirItemExpected = this.stackExpected.isEmpty();
boolean isAirItemFound = this.stackFound.isEmpty();
boolean useBlockModelExpected = hasModelExpected && (isAirItemExpected || useBlockModelConfig || this.stateExpected.getBlock() == Blocks.FLOWER_POT);
boolean useBlockModelFound = hasModelFound && (isAirItemFound || useBlockModelConfig || this.stateFound.getBlock() == Blocks.FLOWER_POT);
BlockModelShapes blockModelShapes = mc.getBlockRendererDispatcher().getBlockModelShapes();
//mc.getRenderItem().zLevel += 100;
IBakedModel model;
if (useBlockModelExpected)
{
model = blockModelShapes.getModelForState(this.stateExpected);
RenderUtils.renderModelInGui(x1, y, zLevel + 1, model, this.stateExpected);
}
else
{
mc.getRenderItem().renderItemAndEffectIntoGUI(mc.player, this.stackExpected, x1, y);
mc.getRenderItem().renderItemOverlayIntoGUI(textRenderer, this.stackExpected, x1, y, null);
}
if (useBlockModelFound)
{
model = blockModelShapes.getModelForState(this.stateFound);
RenderUtils.renderModelInGui(x2, y, zLevel + 1, model, this.stateFound);
}
else
{
mc.getRenderItem().renderItemAndEffectIntoGUI(mc.player, this.stackFound, x2, y);
mc.getRenderItem().renderItemOverlayIntoGUI(textRenderer, this.stackFound, x2, y, null);
}
//mc.getRenderItem().zLevel -= 100;
//GlStateManager.disableBlend();
RenderUtils.disableItemLighting();
textRenderer.drawString(this.nameExpected, x1 + 20, y + 4, 0xFFFFFFFF);
textRenderer.drawString(this.nameFound, x2 + 20, y + 4, 0xFFFFFFFF);
y += 20;
textRenderer.drawString(this.blockRegistrynameExpected, x1, y, 0xFF4060FF);
textRenderer.drawString(this.blockRegistrynameFound, x2, y, 0xFF4060FF);
y += StringUtils.getFontHeight() + 4;
List<String> propsExpected = BlockUtils.getFormattedBlockStateProperties(this.stateExpected, " = ");
List<String> propsFound = BlockUtils.getFormattedBlockStateProperties(this.stateFound, " = ");
RenderUtils.renderText(x1, y, 0xFFB0B0B0, propsExpected);
RenderUtils.renderText(x2, y, 0xFFB0B0B0, propsFound);
GlStateManager.popMatrix();
}
}