Minecraft 1.21.1 -> 1.21.2 模组迁移入门文档
本文档是一个高层次、非详尽的概述,介绍如何将您的模组从 1.21.1 迁移到 1.21.2。本文不涉及任何特定的模组加载器,只关注原版类的变更。所有提供的名称均使用官方的 Mojang 映射。
本入门文档采用 知识共享署名 4.0 国际许可协议 授权,因此您可以自由地将其用作参考,并请留下链接以便其他读者查阅。
如果存在任何不正确或缺失的信息,请在本仓库提交 issue,或在 Neoforged Discord 服务器中 @ChampionAsh5357。
资源包变更
原版中有许多面向用户的变更为未在下面讨论,但这些变更可能与模组制作者相关。您可以在 Misode 的版本更新日志 中找到它们的列表。
持有者集 过渡
许多之前使用 TagKey 或原始注册表对象的方法已被直接的 HolderSet 对象取代。HolderSet 本质上是一个注册表对象引用的列表,游戏可以根据需要动态更新和管理它。实际上有两种 HolderSet:直接和命名。命名的 HolderSet 是游戏中标签的对象表示。之所以称为命名集,是因为 HolderSet 通过标签名称引用。而直接的 HolderSet 是通过 HolderSet#direct 创建的,它作为一个内联的值列表。当不需要定义单独对象来构造某个值时,这些很有用。
JSON 示例:
// HolderSet#direct 包含一个元素
{
"holder_set": "minecraft:apple"
}
// HolderSet#direct 包含多个元素
{
"holder_set": [
"minecraft:apple",
"minecraft:stick"
]
}
// HolderSet 引用(标签)
{
"holder_set": "#minecraft:planks"
}
通常,除了在提供者生成期间,您永远不应该在代码中构造持有者集。每种集类型都有不同的构造方法。
首先,要处理 Holder 或 HolderSet,您需要通过 Registry 访问静态注册表实例,或者通过 HolderGetter 访问数据包注册表。HolderGetter 可以在数据包注册表生成期间从 BootstrapContext#lookup 获得,或者在生成期间或游戏过程中的 MinecraftServer#registryAccess 从 HolderLookup$Provider#lookupOrThrow 获得。
一旦可用,对于直接的 HolderSet,您需要获取注册表对象的 Holder 形式。对于静态注册表,通过 Registry#wrapAsHolder 完成。对于数据包注册表,通过 HolderGetter#getOrThrow 完成。
// 物品的直接 HolderSet
HolderSet<Item> items = HolderSet.direct(BuiltInRegistries.ITEM.wrapAsHolder(Items.APPLE));
// 配置功能的直接 HolderSet
// 假设我们可以访问 HolderGetter<ConfiguredFeature<?, ?>> 注册表
Holderset<ConfiguredFeature<?, ?>> features = HolderSet.direct(registry.getOrThrow(OreFeatures.ORE_IRON));
对于命名的 HolderSet,过程类似。对于静态和动态注册表,都调用 HolderGetter#getOrThrow。
// 物品的命名 HolderSet
HolderSet<Item> items = BuiltInRegistries.ITEM.getOrThrow(ItemTags.PLANKS);
// 生物群系的命名 HolderSet
// 假设我们可以访问 HolderGetter<Biome> 注册表
Holderset<Biome> biomes = registry.getOrThrow(BiomeTags.IS_OCEAN);
由于这些变更遍及整个代码库,它们将在更相关的子章节中列出。
GUI 渲染类型
GuiGraphics 中的 GUI 渲染方法现在接受一个 Function<ResourceLocation, RenderType> 来确定如何渲染图像。此外,blit 方法现在需要指定 PNG 的大小。
// 对于某个 GuiGraphics graphics
graphics.blit(
// 如何渲染纹理
RenderType::guiTextured,
// 之前的纹理参数
...,
// 要使用的 PNG 大小
256, 256);
这意味着那些提供设置纹理或其他可在着色器中指定属性的辅助方法已被移除。
com.mojang.blaze3d.pipeline.RenderTarget#blitToScreen(int, int, boolean)->blitAndBlendToScreennet.minecraft.client.gui.GuiGraphicsdrawManaged已移除setColor已移除 - 现在是blit和blitSprite方法中的一个参数blit(int, int, int, int, int, TextureAtlasSprite, *)已移除bufferSource->drawSpecial,不是一对一,因为该方法接受一个MultiBufferSource的消费者,并结束当前批次,而不是仅仅返回MultiBufferSource
net.minecraft.client.gui.components.PlayerFaceRenderer- 除
draw(GuiGraphics, PlayerSkin, int, int, int)之外的所有draw方法都接受一个额外的int参数,用于定义颜色
- 除
net.minecraft.client.renderer.RenderType-guiTexturedOverlay- 获取叠加在游戏屏幕上的图像的渲染类型。 -guiOpaqueTexturedBackground- 获取应用于菜单背景的 GUI 纹理的渲染类型。 -guiNauseaOverlay- 获取恶心覆盖层的渲染类型。 -guiTextured- 获取 GUI 菜单内图像的渲染类型。net.minecraft.client.resources.metadata.gui.GuiSpriteScaling$NineSlice现在接受一个布尔值,表示纹理的中心部分是否应拉伸以适应大小。
着色器重写
着色器的内部实现已被大量重写。
着色器文件
主要变更是定义的采样器和后期着色器。
DiffuseSampler 和 DiffuseDepthSampler 已根据应用目标被赋予新名称:InSampler、MainSampler 和 MainDepthSampler。InSampler 用于除 transparency 程序着色器之外的所有场景。
// 在某个着色器 JSON 中
{
"samplers": [
{ "name": "MainSampler" },
// ...
]
}
在后处理效果着色器中,它们已被完全改变。有关变更的完整分析,请参见 PostChainConfig,但总的来说,所有目标现在都是对象的键,所有通道输入和过滤器现在是采样器输入的列表。如下所示:
// 旧的后处理效果着色器 JSON
// 在 assets/<namespace>/shaders/post 中
{
"targets": [
"swap"
],
"passes": [
{
"name": "invert",
"intarget": "minecraft:main",
"outtarget": "swap",
"use_linear_filter": true,
"uniforms": [
{
"name": "InverseAmount",
"values": [ 0.8 ]
}
]
},
{
"name": "blit",
"intarget": "swap",
"outtarget": "minecraft:main"
}
]
}
// 新的后处理 JSON
// 在 assets/<namespace>/post_effect 中
{
"targets": {
"swap": {} // swap 现在是一个目标对象(除非另有指定,否则为全屏)
},
"passes": [
{
// 要应用的程序名称(之前为 'name')
// assets/minecraft/shaders/post/invert.json
"program": "minecraft:post/invert",
// inputs 现在是一个列表
"inputs": [
{
// 目标是 InSampler
// 采样器必须在程序着色器 JSON 中可用
"sampler_name": "In",
// 从主屏幕读取(之前为 'intarget')
"target": "minecraft:main",
// 使用 GL_LINEAR(之前为 'use_linear_filter')
"bilinear": true
}
],
// 写入 swap 目标(之前为 'outtarget')
"output": "swap",
"uniforms": [
{
"name": "InverseAmount",
"values": [ 0.8 ]
}
]
},
{
"program": "minecraft:post/blit",
"inputs": [
{
"sampler_name": "In",
"target": "swap"
}
],
"output": "minecraft:main"
}
]
}
着色器程序
所有着色器,无论它们在何处使用(作为程序或后处理效果的一部分),都在 assets/<namespace>/shaders 中有一个 JSON。该 JSON 定义了着色器将使用的所有内容,由 ShaderProgramConfig 定义。主要增加是对 ResourceLocation 相对引用的更改,以及在加载期间动态添加 defines 头。
// 对于某个 assets/my_mod/shaders/my_shader.json
{
// 指向 assets/my_mod/shaders/my_shader.vsh(之前为 'my_shader',无 id 指定)
"vertex": "my_mod:my_shader",
// 指向 assets/my_mod/shaders/my_shader.fsh(之前为 'my_shader',无 id 指定)
"fragment": "my_mod:my_shader",
// 向着色器添加 '#define' 头
"defines": {
// #define <key> <value>
"values": {
"ALPHA_CUTOUT": "0.1"
},
// #define flag
"flags": [
"NO_OVERLAY"
]
},
// 要在着色器中使用的采样器统一变量列表
// 有 12 个纹理采样器统一变量 Sampler0-Sampler11,但通常只提供 Sampler0
// 此外,对于后处理着色器,有动态的 '*Sampler',它们被绑定以读取指定的目标或 'minecraft:main'
"samplers": [
{ "name": "Sampler0" }
],
// 可在着色器中访问的统一变量列表
// 可用统一变量的列表可以在 CompiledShaderProgram#setUniforms 中找到
"uniforms": [
{ "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
{ "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
{ "name": "ModelOffset", "type": "float", "count": 3, "values": [ 0.0, 0.0, 0.0 ] },
{ "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] }
]
}
// 对于某个 assets/my_mod/shaders/my_shader.vsh(顶点着色器)
// GLSL 版本
#version 150
// 导入 Mojang GLSL 文件
// 位于 assets/<namespace>/shaders/include/<path>
#moj_import <minecraft:light.glsl>
// 注入定义(可以使用 'ALPHA_CUTOUT' 和 'NO_OVERLAY')
// 由下面传递给 ShaderProgram 的 VertexFormat 定义
in vec3 Position; // vec3 浮点数
in vec4 Color; // vec4 无符号字节(0-255)
// 由 JSON 定义的采样器
uniform sampler2D Sampler0;
// 由 JSON 提供的统一变量
uniform mat4 ModelViewMat;
uniform mat4 ProjMat;
uniform vec3 ModelOffset;
// 输出到片段着色器的值
out float vertexDistance;
out vec4 vertexColor;
out vec2 texCoord0;
void main() {
// 在此处设置输出值
}
// 对于某个 assets/my_mod/shaders/my_shader.fsh(片段着色器)
// GLSL 版本
#version 150
// 导入 Mojang GLSL 文件
// 位于 assets/<namespace>/shaders/include/<path>
#moj_import <minecraft:fog.glsl>
// 注入定义(可以使用 'ALPHA_CUTOUT' 和 'NO_OVERLAY')
// 由上面顶点着色器的输出定义
in float vertexDistance;
in vec4 vertexColor;
in vec2 texCoord0;
// 由 JSON 定义的采样器
uniform sampler2D Sampler0;
// 由 JSON 提供的统一变量
uniform vec4 ColorModulator;
// 输出到帧缓冲区的值(像素的颜色)
out vec4 fragColor;
void main() {
// 在此处设置输出值
}
在代码方面,着色器在内部存储为 ShaderProgram 或 CompiledShaderProgram。ShaderProgram 表示标识符,而 CompiledShaderProgram 表示要运行的着色器本身。两者通过 ShaderManager 链接在一起。
除非指定为核心着色器,否则着色器程序是动态编译的。这通过将 ShaderProgram 注册到 CoreShaders#PROGRAMS 来完成。
// 访问 List<ShaderProgram> PROGRAMS
ShaderProgram MY_SHADER = new ShaderProgram(
// 指向 assets/my_mod/shaders/my_shader.json
ResourceLocation.fromNamespaceAndPath("my_mod", "my_shader"),
// 传入着色器使用的顶点格式
DefaultVertexFormat.POSITION_COLOR,
// 列出 '#define' 值和标志
// 值:'#define <key> <value>'
// 标志:'#define <flag>'
ShaderDefines.EMPTY
)
然后通过调用 RenderSystem#setShader 并传入相应的 ShaderProgram 来设置着色器程序。实际上,所有对 GameRenderer#get*Shader 的引用都应替换为 ShaderProgram 引用。
// 在某个渲染方法中
RenderSystem.setShader(MY_SHADER);
// 为 RenderType 创建新的 ShaderStateShard
ShaderStateShard MY_SHARD = new ShaderStateShard(MY_SHADER);
com.mojang.blaze3d.ProjectionType- 一个枚举,包含投影矩阵应如何渲染的逻辑。com.mojang.blaze3d.buffersBufferType- 一个枚举,指定 GL 目标缓冲区类型。GpuBuffer- 围绕 GL 缓冲区调用的包装器,用于处理屏幕渲染。GpuFence- 用于管理 GPU 围栏同步状态的句柄。
com.mojang.blaze3d.platform.GlStateManagerglShaderSource现在接受一个String而不是List<String>_glMapBufferRange- 委托给GL30#glMapBufferRange。_glFenceSync- 委托给GL32#glFenceSync。_glClientWaitSync- 委托给GL32#glClientWaitSync。_glDeleteSync- 委托给GL32#glDeleteSync。_glBuffserSubData- 委托给GL15#glBufferSubData。
com.mojang.blaze3d.preprocessor.GlslPreprocessor#injectDefines- 将任何定义的源注入到加载的.*sh文件的顶部。com.mojang.blaze3d.shadersBlendMode、Effect、EffectProgram、Program、ProgramManager、Shader已被整合到CompiledShader中Unform不再接受ShaderglGetAttribLocation已移除glBindAttribLocation->VertexFormat#bindAttributessetFromConfig- 根据另一个统一配置的值和计数设置统一参数。
com.mojang.blaze3d.systems.RenderSystemsetShader现在接受CompiledShaderProgram或ShaderProgramclearShader- 清除当前系统着色器。runAsFancy已移除,由LevelRenderer#getTransparencyChain内部处理setProjectionMatrix现在接受一个ProjectionType而不仅仅是VertexSortinggetVertexSorting->getProjectionType;不是一对一,但VertexSorting可在ProjectionType上访问
com.mojang.blaze3d.vertex.VertexBufferdrawWithShader在传入null的CompiledShaderProgram时将成为空操作$Usage->com.mojang.blaze3d.buffers.BufferUsage
net.minecraft.client.Minecraft#getShaderManager- 返回管理所有着色器和后处理效果的管理器。net.minecract.client.rendererEffectInstance类已移除,在大多数情况下被CompiledShaderProgram取代GameRendererget*Shader->CoreShaders#*shutdownEffect->clearPostEffectcreateReloadListener->ShaderManagercurrentEffect->currentPostEffect
ItemBlockRenderTypes#getRenderType不再接受一个表示是否使用半透明渲染类型的布尔值ShaderInstance->CompiledShaderProgramCHUNK_OFFSET->MODEL_OFFSET- JSON 着色器:
ChunkOffset->ModelOffset
- JSON 着色器:
getUniformConfig- 返回给定名称的统一变量的配置。
LevelRenderer#graphicsChanged已移除,由LevelRenderer#getTransparencyChain内部处理PostChainConfig- 表示后处理效果着色器 JSON 如何构建的配置。PostPass现在接受代表输出目标的ResourceLocation而不是输入和输出RenderTarget或boolean过滤模式,要使用的CompiledShaderProgram而不是ResourceProvider,以及着色器要使用的一组统一变量- 不再实现
AutoCloseable addToFrame不再接受float时间getEffect->getShaderaddAuxAsset->addInputprocess->addToFrame$Input- 表示后处理效果着色器的输入。$TargetInput- 来自RenderTarget的输入。$TextureInput- 来自纹理的输入。
- 不再实现
PostChain构造函数现在通过load创建- 不再实现
AutoCloseable MAIN_RENDER_TARGET现在是公开的getName已移除,被ShaderProgram#configId取代process不再接受DeltaTracker$TargetBundle- 处理链中资源句柄的获取和替换。
- 不再实现
RenderTypeentityTranslucentCull、entityGlintDirect已移除armorTranslucent- 一种渲染类型,用于渲染可以具有半透明纹理的盔甲。
ShaderDefines- 着色器用作常量的定义值和标志。ShaderManager- 加载着色器的资源监听器。ShaderProgram- 着色器的标识符。ShaderProgramConfig- 程序着色器 JSON 的定义。Sheets#translucentCullBlockSheet已移除SkyRenderer现在实现AutoCloseable
net.minecraft.client.renderer.entity.ItemRenderergetFoilBufferDirect已移除,被getFoilBuffer取代ITEM_COUNT_BLIT_OFFSET->ITEM_DECORATION_BLIT_OFFSET
实体渲染状态
由于 EntityRenderState 的加入,实体模型和渲染器几乎完全重做。EntityRenderState 本质上是数据对象类,只公开渲染实体所需的计算信息。例如,Llama 不需要知道它的背包里有什么,只需要知道它有一个箱子要在层中渲染。
首先,您需要选择要使用的 EntityRenderState,或者如果需要将额外信息传递给渲染器,则使用子类创建一个。最常见的子类状态是 EntityRenderState 或用于活体的 LivingEntityRenderState。这些字段应该是可变的,因为状态类只为每个渲染器创建一次。
// 假设 MyEntity 继承 LivingEntity
public class MyEntityRenderState extends LivingEntityRenderState {
// 字段示例
boolean hasExampleData;
}
然后,您创建将渲染实体的 EntityModel。EntityModel 有一个泛型,接受 EntityRenderState,并在其父类中接受 ModelPart 根,以及可选的 RenderType 工厂。默认情况下没有需要实现的方法;但是,如果您需要设置任何类型的模型运动,您需要覆盖 setupAnim,它使用渲染状态修改 ModelPart 的可变字段。如果您的模型没有任何动画,则可以使用 Model$Simple 实现。它不需要实现任何东西。
public class MyEntityModel extends EntityModel<MyEntityRenderState> {
public MyEntityModel(ModelPart root) {
super(root);
// ...
}
@Override
public void setupAnim(MyEntityRenderState state) {
// 调用 resetPose 以及父类所做的任何其他变换
super.setupAnim(state);
// 在此处对模型部件执行变换
}
}
EntityModel 还有三个来自 Model 子类的 final 方法:root,获取根 ModelPart;allParts,返回所有 ModelPart 的扁平列表;以及 resetPose,将 ModelPart 恢复到其默认状态。
LayerDefinition、MeshDefinition、PartDefinition 和 CubeDeformation 在 LayerDefinitions 中 ModelLayerLocation -> LayerDefinition 映射的实现和构造保持不变。
模型变换呢?例如,实体的幼年版本,或者模型完全切换的情况?在这些情况下,为每个模型注册一个单独的层定义。例如,Llama 将有一个用于主 Llama 模型的模型层、幼年模型层、成年和幼年装饰层,以及最后用于唾沫的层。由于模型通常彼此相似,只有轻微的变换,LayerDefinition 添加了一个新方法来接受 MeshTransformer。MeshTransformer 基本上是 MeshDefinition 上的一元运算符。对于幼年模型,提供了一个 BabyModelTransform 网格变换器,可以通过 LayerDefinition#apply 应用。
public class MyEntityModel extends EntityModel<MyEntityRenderState> {
public static final MeshTransformer BABY_TRANSFORMS = ...;
public static LayerDefinition create() {
// ...
}
}
// 在注册模型层的地方
ModelLayerLocation MY_ENTITY = layers.register("examplemod:my_entity");
ModelLayerLocation MY_ENTITY_BABY = layers.register("examplemod:my_entity_baby");
// 在注册层定义的地方
defns.register(MY_ENTITY, MyEntityModel.create());
defns.register(MY_ENTITY_BABY, MyEntityModel.create().apply(MyEntityModel.BABY_TRANSFORMS));
但是模型如何知道使用哪个渲染状态?这就是 EntityRenderer 的作用。EntityRenderer 有两个泛型:Entity 的类型和 EntityRenderState 的类型。EntityRenderer 接受一个 Context 对象,与之前类似。此外,需要实现 getTextureLocation,不过这次它接受渲染状态而不是实体。需要实现/覆盖的新方法是 createRenderState 和 extractRenderState。createRenderState 构造默认渲染状态对象。而 extractRenderState 则填充当前正在渲染的实体的渲染状态。如果您没有使用现有的渲染状态类,则需要覆盖 extractRenderState。
当然,还有 EntityRenderer 的子类。首先,有 LivingEntityRenderer。它有一个额外的泛型,即正在渲染的 EntityModel,并在构造函数中接受该值以及阴影半径。这个渲染器还接受 RenderLayer,如果您通过渲染状态访问之前的参数,这些层基本保持不变。然后是 MobRenderer,所有实体都扩展它。最后是 AgeableMobRenderer,它接受两个模型——成年和幼年——并根据 LivingEntityRenderState#isBaby 决定渲染哪个。如果实体有幼年形态,应该使用 AgeableMobRenderer 配合 BabyModelTransform。否则,您很可能使用 MobRenderer 或 EntityRenderer。
public class MyEntityRenderer extends AgeableMobRenderer<MyEntity, MyEntityRenderState, MyEntityModel> {
public MyEntityRenderer(EntityRendererProvider.Context ctx) {
super(
ctx,
new MyEntityModel(ctx.bakeLayer(MY_ENTITY)), // 成年模型
new MyEntityModel(ctx.bakeLayer(MY_ENTITY_BABY)), // 幼年模型
0.7f // 阴影半径
);
// ...
}
@Override
public ResourceLocation getTextureLocation(MyEntityRenderState state) {
// 在此处返回实体纹理
}
@Override
public MyEntityRenderState createRenderState() {
// 构造可重用的状态
return new MyEntityRenderState();
}
@Override
public void extractRenderState(MyEntity entity, MyEntityRenderState state, float partialTick) {
// 设置活体实体和实体渲染状态信息
super.extractRenderState(entity, state, partialTick);
// 设置我们自己的变量
state.hasExampleData = entity.hasExampleData();
}
}
// 在注册实体渲染器的地方
renderers.register(MyEntityTypes.MY_ENTITY, MyEntityRenderer::new);
net.minecraft.client.modelAbstractBoatModel- 一个模型,假设存在left_paddle和right_paddle,并根据船的划桨时间进行动画。AgeableHierarchicalModel、ColorableAgeableListModel、AgeableListModel->BabyModelTransformAnimationUtilsanimateCrossbowCharge现在接受一个表示充能持续时间的float和一个表示使用刻数的int,而不是LivingEntityswingWeaponDown现在接受一个HumanoidArm而不是Mob
BabyModelTransform- 一种网格变换器,应用模型的幼年缩放形式。BoatModelcreatePartsBuilder已移除createChildren->addCommonParts,现在是私有的createBodyModel->createBoatModel、createChestBoatModelwaterPatch->createWaterPatchparts已移除
ChestBoatModel->BoatModel#createChestBoatModelChestedHorseModel类已移除,现在完全存在于LlamaModel和DonkeyModel中ChestRaftModel->RaftModel#createChestRaftModelColorableHierarchicalModel现在存储在单独的EntityRenderState中EntityModel- 泛型现在接受
EntityRenderState setupAnim只接受EntityRenderState泛型prepareMobModel已移除copyPropertiesTo已移除,仍然存在于HumanoidModel中
- 泛型现在接受
HierarchicalModel类已移除HumanoidModel#rotLerpRad->Mth#rotLerpRadListModel类已移除ModelrenderToBuffer现在是 final 的root- 返回根ModelPart。getAnyDescendantWithName- 返回根中具有指定名称的第一个后代。animate- 给定动画的当前状态和定义,在当前时间和最大时间之间变换模型以播放动画。animateWalk- 对模型的行走循环进行动画。applyStatic- 将即时动画应用于指定状态。$Simple- 构造一个没有额外动画的简单模型。
ModelUtils类已移除ParrotModel#getState->getPose,现在是公开的PlayerModel不再有泛型renderEars->PlayerEarsModelrenderCape->PlayerCapeModelgetRandomModelPart->getRandomBodyPartgetArmPose- 返回玩家给定其渲染状态的手臂姿势。
RaftModel#createBodyModel->createRaftModelWardenModel#getTendrilsLayerModelParts、getHeartLayerModelParts、getBioluminescentLayerModelParts、getPulsatingSpotsLayerModelParts现在接受WardenRenderStateWaterPatchModel->BoatModel#createWaterPatch和Model$Simple
net.minecraft.client.model.geomModelLayerLocation现在是一个记录ModelLayerscreateRaftModelName、createChestRaftModelName已移除createSignModelName->createStandingSignModelName、createWallSignModelNamecreateBoatModelName、createChestBoatModelName已移除
ModelPartrotateBy- 使用给定的Quaternionf旋转部件。$Cube#polygons、$Polygon、$Vertex现在是公开的
PartPose现在是一个记录translated- 平移一个姿势。withScale、scaled- 缩放一个姿势。
net.minecraft.client.model.geom.buildersLayerDefinition#apply- 对定义应用网格变换器并返回一个新的。MeshDefinition#transformed- 对根姿势应用变换并返回一个新的。MeshTransformer- 将现有的MeshDefinition转换为给定形式。PartDefinitionaddOrReplaceChild现在有一个接受PartDefinition的重载clearChild- 从部件定义中移除子部件。getChildren- 获取当前部件的所有子部件。transformed- 对当前姿势应用变换并返回一个新的。
net.minecraft.client.renderer.entityAbstractBoatRenderer- 一个船渲染器,包含用于船模型和船本身任何附加内容的方法。AgeableMobRenderer- 一个接受幼年和成年模型的生物渲染器。BoatRenderer现在接受一个ModelLayerLocation而不是booleanEntityRenderDispatcher现在接受一个MapRendererrender不再接受实体的 Y 旋转
EntityRenderer现在接受EntityRenderState的泛型getRenderOffset只接受EntityRenderStategetBoundingBoxForCulling- 返回实体的边界框以确定是否剔除。affectedByCulling- 返回实体是否可以被剔除。render只接受渲染状态,以及堆栈、缓冲区源和包光shouldShowName现在接受一个double表示相机到实体的平方距离getTextureLocation已移除,被移动到使用它的类中,如LivingEntityRenderer- 后续的
getTextureLocation实现可能是 protected 或 private
- 后续的
renderNameTag现在接受渲染状态而不是实体,并移除了部分刻floatgetNameTag- 从实体获取名称标签。getShadowRadius现在接受渲染状态而不是实体createRenderState- 创建渲染状态对象。extractRenderState- 将实体中的任何数据读取到渲染状态。
EntityRendererProvider$Context接受MapRenderer而不是ItemInHandRendererLivingRendererisShaking现在接受渲染状态而不是实体setupRotations现在接受渲染状态而不是实体getAttackAnim、getBob现在在渲染状态中getFlipDegrees不再接受实体getWhiteOverlayProgress现在接受渲染状态而不是实体,并且不再接受实体的 Y 旋转scale现在接受渲染状态而不是实体,并且不再接受实体的 Y 旋转shouldShowName现在接受一个double表示到相机的平方距离getShadowRadius现在接受渲染状态而不是实体
RaftRenderer- 一个实现AbstractBoatRenderer的木筏渲染器。RenderLayerParent#getTextureLocation已移除
net.minecraft.client.renderer.entity.layersEnergySwirlLayer#isPowered- 返回能量是否被充能。CustomHeadLayer和#translateToHead接受一个CustomHeadLayer$Transforms而不是硬编码变换的缩放信息PlayerItemInHandRenderer接受一个ItemRenderer而不是ItemInHandRendererRenderLayer接受EntityRenderState泛型而不是Entity泛型coloredCutoutModelCopyLayerRender接受一个EntityModel,状态信息捆绑在渲染状态中renderColoredCutoutModel接受非泛型形式的渲染信息,假设为LivingEntityRenderStategetTextureLocation已移除,改为直接传递到适当的位置render现在接受渲染状态而不是实体和参数信息
SaddleLayer有一个接受幼年模型的构造函数。SheepFurLayer->SheepWoolLayerStuckInBodyLayer现在接受要应用卡住对象的模型、卡住对象的纹理以及对象的放置样式numStuck现在接受渲染状态而不是实体renderStuckItem现在是私有的
WardenEmissiveLayer->LivingEntityEmissiveLayer,一个更通用的实现
net.minecraft.client.renderer.entity.player.PlayerRendererrenderRightHand、renderLeftHand现在接受一个ResourceLocation而不是AbstractClientPlayer,以及一个boolean表示是否渲染左袖和/或右袖setupRotations现在接受渲染状态而不是实体和参数信息
net.minecraft.world.entityAnimationState#copyFrom- 从另一个状态复制动画状态。EntitynoCulling->EntityRenderer#affectedByCullinggetBoundingBoxForCulling->EntityRenderer#getBoundingBoxForCulling
LerpingModel类已移除PowerableMob类已移除
模型烘焙
UnbakedModel 现在有一个不同的方法来解析任何依赖项。不再获取依赖项并解析父级,而是通过一个称为 resolveDependencies 的单一方法完成。该方法接受 Resolver。Resolver 负责获取 ResourceLocation 的 UnbakedModel。
// 对于某个 UnbakedModel 实例
public class MyUnbakedModel implements UnbakedModel {
@Nullable
protected ResourceLocation parentLocation;
@Nullable
protected UnbakedModel parent;
private final List<ItemOverride> overrides;
// ...
@Override
public void resolveDependencies(UnbakedModel.Resolver resolver) {
// 获取父模型以进行委托解析
if (this.parentLocation != null) {
this.parent = resolver.resolve(this.parentLocation);
}
}
}
net.minecraft.client.renderer.blockBlockModel#getDependencies、resolveParents->resolveDependenciesBlockModelDefintion现在接受一个MultiPart$Definition,不存在接受List<BlockModelDefinition>的构造函数fromStream、fromJsonElement不再接受$ContextgetVariants已移除isMultiPart已移除instantiate->MultiPart$Definition#instantiate
MultiVariant现在是一个记录UnbakedBlockStateModel- 一个表示方块状态模型的接口,包含一个将具有相同模型的状态分组在一起的单一方法。VariantSelector- 用于从模型描述符构建状态定义的工具。
net.minecraft.client.renderer.block.modelBlockModelMISSING_MATERIAL- 缺失方块纹理的材质。bake不再接受ModelBaker和BlockModel$LoopException类已移除
net.minecraft.client.renderer.block.model.multipart.MultiPart现在实现UnbakedBlockStateModelgetSelectors->$Definition#selectorsgetMultiVariants->$Definition#getMultiVariants
net.minecraft.client.resources.modelBakedModel#getOverrides->overrides,方法默认为空覆盖BlockStateModelLoader只接受缺失的未烘焙模型loadAllBlockStates已移除definitionLocationToBlockMapper- 从给定的资源位置获取状态定义loadBlockStateDefinitions->loadBlockStateDefinitionStackgetModelGroups->ModelGroupCollector$LoadedJson->$LoadedBlockModelDefinition$LoadedModel现在是公开的$LoadedModels- 一个将模型位置映射到已加载模型的记录。
BuiltInModel不再接受ItemOverridesDelegateBakedModel- 一个将所有逻辑委托给提供的BakedModel的工具实现Material#buffer接受另一个boolean,用于处理是否应用闪光效果MissingBlockModel- 方块的缺失模型。ModelBaker#getModel已移除,ModelBakery$ModelBakerImpl中的实现是私有的ModelBakery只接受顶层模型、所有未烘焙模型和缺失模型BUILTIN_SLASH->SpecialModels#builtinModelIdBUILTIN_SLASH_GENERATED->SpecialModels#BUILTIN_GENERATEDBUILTIN_BLOCK_ENTITY->SpecialModels#BUILTIN_BLOCK_ENTITYMISSING_MODEL_LOCATION->MissingBlockModel#LOCATIONMISSING_MODEL_VARIANT->MissingBlockModel#VARIANTGENERATION_MARKER->SpecialModels#GENERATED_MARKERBLOCK_ENTITY_MARKER->SpecialModels#BLOCK_ENTITY_MARKERgetModelGroups->ModelGroupCollector
ModelDiscovery- 方块和物品模型的加载器,例如在读取时如何解析它们。ModelGroupCollector- 一个方块状态收集器,用于将状态映射到它们关联的方块模型。ModelResourceLocation#vanilla已移除MultiPartBakedModel字段现在从选择器中的第一个模型获取,并且是私有的$Builder类已移除,被$Selector取代
SimpleBakedModel、SimpleBakedModel$Builder不再接受ItemOverridesSpecialModels- 内置模型的工具。UnbakedModelgetDependencies、resolveParents->resolveDependenciesbake不再可为 null$Resolver- 确定在顶层或覆盖时如何加载未烘焙模型。
WeightedBakedModel现在接受一个SimpleWeightedRandomList而不是WeightedEntry的列表
装备与物品、模型等等
装备和物品经历了重大改革,其中大部分分散在整个文档中。这是一些核心变更,虽然它们很重要,但由于易于更改,不值得详细解释。
物品名称和模型
物品名称和模型现在直接通过属性中的 ITEM_NAME 和 ITEM_MODEL 数据组件设置。默认情况下,这将使用与以前相同的名称和模型位置,但可以通过 Item$Properties#overrideDescription 和 #overrideModel 设置。overrideDescription 接受要使用的翻译键。还有 useBlockDescriptionPrefix 和 useItemDescriptionPrefix 分别将其更改为默认的方块和物品翻译键。overrideModel 接受模型 JSON 的相对 ResourceLocation。例如,值 examplemod:example_item 将映射到 examplemod:example_item#inventory 的 ModelResourceLocation。这旨在链接到 assets/examplemod/models/item/example_item.json 的模型 JSON。
物品模型有一个小特性。如果模组制作者决定在
inventory变体下在该位置加载特殊模型,则相同的键也可以指向assets/examplemod/models/example_item.json。因此,建议避免在根models和models/item子目录中使用同名模型名称。
可附魔、可修复物品
附魔值和修复物品检查正在被数据组件取代:分别是 DataComponents#ENCHANTABLE 和 DataComponents#REPAIRABLE。这些可以通过 Item$Properties#enchantable 和 #repairable 设置。因此,Item#getEnchantmentValue 和 isValidRepairItem 已移除。
鞘翅 -> 滑翔翼
任何物品如果装备了 DataComponents#GLIDER 值,都可以像鞘翅一样行动。这基本上作为一个标志,表示该物品可用于滑翔。这仅在该物品也有 DataComponents#EQUIPPABLE 条目时有效。
new Item(
new Item.Properties()
.component(DataComponents.GLIDER, Unit.INSTANCE) // 设置为滑翔翼
.component(DataComponents.EQUIPPABLE, /*...*/) // 确定要检查的槽位以查看是否可以使用
);
工具,通过工具材料
物品中的 Tier 已被 ToolMaterial 取代,后者更好地处理工具和剑的创建,而无需手动实现每个方法。ToolMaterial 接受与 Tier 相同的参数,只是作为单个构造函数的参数,而不是作为可实现的方法。然后,将 ToolMaterial 传递给 DiggerItem 子类型,以及两个表示攻击伤害和攻击速度的浮点数。内部调用 ToolMaterial#apply*Properties,它将 ToolMaterial 信息应用到 DataComponents#TOOL 以及给定 float 中的属性。
// 某个工具材料
public static final ToolMaterial WOOD = new ToolMaterial(
BlockTags.INCORRECT_FOR_WOODEN_TOOL, // Tier#getIncorrectBlocksForDrops
59, // Tier#getUses
2.0F, // Tier#getSpeed
0.0F, // Tier#getAttackDamageBonus
15, // Tier#getEnchantmentValue
ItemTags.WOODEN_TOOL_MATERIALS // Tier#getRepairIngredient
);
// 构造 DiggerItem 子类型时
new PickaxeItem(
WOOD, // 工具材料
1.0f, // 攻击伤害
-2.8f, // 攻击速度
new Item.Properties()
)
盔甲材料、装备和模型(纹理)
到目前为止,这是除消耗品之外最大的物品变更。ArmorMaterial 实际上已被废弃,因为几乎所有逻辑都在数据组件中处理,并附加到某些资源包 JSON 以加载关联的纹理。乍一看令人烦恼地复杂,但一旦熟悉了流程,就会相当直观。
ArmorMaterial
ArmorMaterial 本质上是一个记录,将属性列表转换为它们在数据组件上的适当位置,而不是一个注册表对象。这是通过将物品属性和一个额外的设置传递给 #humanoidProperties 或 #animalProperties 来完成的。这些设置应该很熟悉,因为它们与以前版本相比没有变化,唯一的区别是它们现在指定了一个“模型 id”,我们将在下面介绍。盔甲材料与 ArmorType 一起使用:一个枚举,定义了盔甲放置的装备槽位、每种盔甲类型的单位耐久度以及名称(仅用于构造属性修饰符 id)。
ArmorMaterial exampleArmorMaterial = new ArmorMaterial(
15, // 与盔甲类型相乘的耐久度标量
// 一个 ArmorType -> 要应用到实体 ARMOR 属性的半盔甲条数的映射
// 应该为所有 ArmorType 设置
Util.make(new EnumMap<>(ArmorType.class), map -> {
map.put(ArmorType.BOOTS, 2);
map.put(ArmorType.LEGGINGS, 5);
map.put(ArmorType.CHESTPLATE, 6);
map.put(ArmorType.HELMET, 2);
map.put(ArmorType.BODY, 5);
}),
25, // 盔甲的附魔值
SoundEvents.ARMOR_EQUIP_IRON, // 包装的声音事件持有者,表示装备物品时应发出的声音
0f, // ARMOR_TOUGHNESS 属性值
2f, // KNOCKBACK_RESISTANCE 属性值,
ItemTags.REPAIRS_DIAMOND_ARMOR, // 表示可以修复此盔甲的物品的物品标签
// EquipmentModel JSON 的相对位置
// 指向 assets/examplemod/models/equipment/example_armor_material.json
ResourceLocation.fromNamespaceAndPath("examplemod", "example_armor_material")
)
使用 ArmorMaterial,可以将其应用于物品属性,通过调用 humanoidProperties 将盔甲应用到特定的 ArmorType;或者调用 animalProperties 将盔甲应用到 BODY 并只允许特定实体穿戴它们。
这是否意味着 ArmorItem 和 AnimalArmorItem 实际上毫无意义?对于 AnimalArmorItem,这可以争论。AnimalArmorItem 所做的只是有一个 $BodyType 参数,这意味着盔甲只能应用于马或狼,并指定物品破碎声音。另一方面,ArmorItem 只有一个特定用例:确定物品是否可以脱下或交换。这隐式检查当前穿戴的盔甲物品,看它是否不能脱下(通过 PREVENT_ARMOR_CHANGE 附魔),并计算替换盔甲材料上的属性,以便任何热交换只会提高穿戴者的盔甲属性值。
让我们深入一层。
数据组件
ArmorMaterial 指定了要应用于物品的八个数据组件:
MAX_DAMAGE- 设置为物品的最大耐久度乘以ArmorType单位耐久度MAX_STACK_SIZE- 设置为 1DAMAGE- 设置为 0ATTRIBUTE_MODIFIERS- 设置ARMOR和ARMOR_TOUGHNESS属性,以及当大于 0 时的KNOCKBACK_RESISTANCEENCHANTABLE- 设置为附魔值(调用animalProperties时不设置)REPAIRABLE- 设置为表示修复原料的标签键的HolderSetEQUIPPABLE- 设置槽位、装备声音、模型 id、哪些实体可以穿戴该物品,以及是否可从发射器发射
除 EQUIPPABLE 之外的所有内容都已在上文解释或从先前版本就已存在,因此本入门文档从现在起只关注 EQUIPPABLE。
Equippable
Equippable 曾经是一个接口,现在是一个数据组件,包含实体如何装备此物品以及装备是否应被渲染。因此,一个物品只能装备到一个槽位。这可以通过 Equippable 构造函数或通过 Equippable#builder 构建器完成。
new Item(
new Item.Properties()
.component(DataComponents.EQUIPPABLE, new Equippable(
EquipmentSlot.HEAD, // 物品可以装备到的槽位
SoundEvents.ARMOR_EQUIP_IRON, // 装备物品时播放的声音
// EquipmentModel JSON 的相对位置
// 指向 assets/examplemod/models/equipment/example_armor_material.json
// 当设置为空 optional 时,物品不会尝试渲染为装备
Optional.of(ResourceLocation.fromNamespaceAndPath("examplemod", "example_armor_material")),
// 穿戴时覆盖在玩家屏幕上的纹理的相对位置
// 指向 assets/examplemod/textures/example_overlay.png
// 当设置为空 optional 时,不在玩家屏幕上渲染
Optional.of(ResourceLocation.withDefaultNamespace("examplemod", "example_overlay")),
// 可以装备此物品的实体的 HolderSet(直接或标签)
// 当设置为空 optional 时,任何实体都可以装备此物品
Optional.of(HolderSet.direct(EntityType::builtInRegistryHolder, EntityType.ZOMBIE)),
// 物品是否可以从发射器中发射时装备
true,
// 在快速装备期间物品是否可以从玩家身上交换下来
false,
// 物品在受到攻击时是否应该损坏(通常用于装备)
// 也必须是可损坏的物品
false
))
);
装备模型?
如上所述,Equippable 物品以及 ArmorMaterial 委托可以指定一个模型 id 来确定装备应如何渲染。但是,这个 id 链接到什么?它指向一个序列化为 JSON 的 EquipmentModel,位于资源包的 models/equipment 中。此 JSON 定义了要渲染的可装备物品的层和纹理。这不指定模型,因此这个记录有些用词不当。最好将其视为应用于传入模型的装备纹理。
EquipmentModel 作为先前 ArmorMaterial$Layer 的一个更具功能通用性的版本,后者已被移除。每个 EquipmentModel 实际上是一个 $LayerType 到要渲染的 $Layer 列表的映射。
$LayerType 是一个枚举,表示要渲染装备模型的层。虽然这些是非特定的,但它们由特定的实体渲染器通过层渲染器实现和读取。例如,HUMANOID 由 HumanoidArmorLayer 用于渲染头部、胸部和脚部;因此,任何对 HUMANOID 的使用都将使用该系统进行渲染。另一个例子是 WOLF_BODY 由 WolfArmorLayer 用于渲染身体盔甲。因此,如果使用现有的层类型(除非您的模组加载器支持枚举扩展,否则这是唯一的情况),请确保它们与现有的渲染器兼容。
$Layer 列表指定了在传入模型上渲染时使用的纹理和可染色选项。第一个参数指定纹理位置,相对于 textures/entity/equipment。第二个参数指定一个可选项,表示纹理是否可以被染色(通过 ItemTags#DYEABLE 与 DYED_COLOR 数据组件一起存储)。当指定时,可以指定一个可选颜色用于物品未染色时。如果为空,则物品未染色时盔甲将不可见。最后一个参数指示是否应改用提供给渲染器的纹理,例如为玩家渲染自定义鞘翅纹理时。
// 在 assets/examplemod/models/equipment/example_armor_material.json
{
// 层映射
"layers": {
// 要应用的 EquipmentModel$LayerType 的序列化名称
"humanoid": [
// 按列表中提供的顺序渲染的层列表
{
// 层的相对纹理
// 指向 assets/examplemod/textures/entity/equipment/example.png
"texture": "examplemod:example",
// 当指定时,允许纹理被 DYED_COLOR 数据组件中的颜色染色
// 否则,不能染色
"dyeable": {
// 一个 RGB 值(总是不透明的颜色)
// 0x7683DE 作为十进制
// 当未指定时,设置为 0(意味着透明或不可见)
"color_when_undyed": 7767006
},
// 为 true 时,改用传递给层渲染器的纹理
"use_player_texture": true
}
// ...
]
// ...
}
}
EquipmentModel.builder()
.addLayers(EquipmentModel.LayerType.HUMANOID, new EquipmentModel.Layer(
// 层的相对纹理
// 指向 assets/examplemod/textures/entity/equipment/example.png
ResourceLocation.fromNamespaceAndPath("examplemod", "example"),
// 当指定时,允许纹理被 DYED_COLOR 数据组件中的颜色染色
// 否则,不能染色
Optional.of(new EquipmentModel.Dyeable(
// 一个 RGB 值(总是不透明的颜色)
// 当未指定时,设置为 0(意味着透明或不可见)
Optional.of(0x7683DE)
)),
// 为 true 时,改用传递给层渲染器的纹理
true
)/*, ... */)
.build();
然后通过在 EntityRenderer 或 RenderLayer 的渲染函数中调用 EquipmentLayerRenderer#renderLayers 来渲染装备模型。EquipementLayerRenderer 作为渲染上下文的一部分通过 EntityRendererProvider$Context#getEquipmentRenderer 传入。
// 在某个渲染方法中,其中 EquipmentLayerRenderer equipmentLayerRenderer 是一个字段
this.equipmentLayerRenderer.renderLayers(
// 要渲染的层类型
EquipmentModel.LayerType.HUMANOID,
// 表示 EquipmentModel JSON 的模型 id
// 这将在 `EQUIPPABLE` 数据组件中通过 `model` 设置
ResourceLocation.fromNamespaceAndPath("examplemod", "example_armor_material"),
// 要将纹理应用到的模型
// 这些通常是与实体模型分开的模型
// 并且是链接到 LayerDefinition 的单独 ModelLayer
model,
// 表示作为模型渲染的物品的物品堆栈
// 这仅用于获取可染色、闪光和盔甲纹饰信息
stack,
// 用于在正确位置渲染模型的堆栈
poseStack,
// 用于获取渲染类型顶点消费者的缓冲区源
bufferSource,
// 打包的光照纹理
lighting,
// 当某个层的 use_player_texture 为 true 时,如果不为 null,则渲染的纹理的绝对路径
ResourceLocation.fromNamespaceAndPath("examplemod", "textures/other_texture.png");
)
物品的技术性变更
net.minecraft.client.Minecraft#getEquipmentModels- 获取包含当前装备模型纹理的EquipmentModelSet。net.minecraft.client.gui.GuiGraphics#renderTooltip、renderComponentTooltip现在有一个参数,用于接受工具提示背景和框架纹理的相对目录,如果为null则使用默认值net.minecraft.client.gui.screens.inventory.tooltip.TooltipRenderUtil#renderTooltipBackground现在有一个参数,用于接受工具提示背景和框架纹理的相对目录,如果为null则使用默认值net.minecraft.client.renderer.block.modelItemOverrides->BakedOverrides- 构造函数不再接受父级
BlockModel resolve->findOverride,不再接受后备模型
- 构造函数不再接受父级
ItemOverride、ItemOverride$Predicate现在是一个记录getPredicates已移除,使用predicatesgetModel->model
net.minecraft.client.renderer.entityEntityRenderDispatcher现在接受EquipmentModelSetEntityRendererProvider$ContextgetEquipmentModels- 获取当前装备纹理。getEquipmentRenderer- 获取装备的渲染器。
ItemRenderer不再接受Minecraft实例和TextureManagerTRIDENT_MODEL、SPYGLASS_MODEL现在是公开的TRIDENT_IN_HAND_MODEL、SPYGLASS_IN_HAND_MODEL已移除getItemModelShaper已移除renderBundleWithSelectedItem->renderBundleItem,不是一对一
net.minecraft.client.renderer.entity.layersCapeLayer现在接受EquipmentModelSetElytraLayer->WingsLayer- 构造函数现在接受
EquipmentLayerRenderer
- 构造函数现在接受
EquipmentLayerRenderer- 在提供的模型上渲染装备层的渲染器。HorseArmorLayer现在接受EquipmentLayerRendererHumanoidArmorLayer现在接受EquipmentLayerRenderer而不是ModelManagershouldRender- 返回可装备物品是否应在给定槽位中渲染。
LlamaDecorLayer现在接受EquipmentLayerRendererWolfArmorLayer现在接受EquipmentLayerRenderer
net.minecraft.client.renderer.entity.player.PlayerRenderer#getArmPose现在是私有的,被一个只接受HumanoidArm和PlayerRenderState的公共方法取代net.minecraft.client.resources.modelEquipmentModelSet- 从models/equipment加载EquipmentModel的资源监听器。ItemModel- 物品的模型。
net.minecraft.core.component.DataComponentsITEM_MODEL- 返回物品的模型。item/被剥离,意味着minecraft:apple指向minecraft/textures/models/item/apple.json。EQUIPPABLE- 表示物品在给定槽位中是可装备的。还包含要渲染的装备模型。GLIDER- 表示物品可用于在空中滑翔。必须与EQUIPPABLE一起使用。TOOLTIP_STYLE- 确定表示工具提示应如何渲染的相对位置
net.minecraft.core.dispenser.EquipmentDispenseItemBehavior- 处理如何从发射器中发射装备。net.minecraft.core.registries.BuiltInRegistries#、Registries#ARMOR_MATERIAL不再是一个注册表,完全通过数据组件处理net.minecraft.world.entityEquipmentSlot#getFilterFlag->getId- 还有一个方法
getFilterBit用于将 ID 转换为位掩码
- 还有一个方法
LivingEntitycanContinueToGlide->canGlide,不再接受ItemStackcanTakeItem被DataComponents#EQUIPPABLE取代canEquipWithDispenser- 返回堆栈在从发射器发射时是否可以装备。canDispenserEquipIntoSlot- 一个实体覆盖,指定发射器是否可以将装备放入给定槽位。isEquippableInSlot- 返回堆栈是否可以在给定槽位中装备。canGlideUsing- 实体是否可以使用提供的槽位中的堆栈滑翔。
MobcanReplaceCurrentItem现在接受EquipmentSlotisBodyArmorItem被DataComponents#EQUIPPABLE取代
net.minecraft.world.entity.animal.horseHorse#isBodyArmorItem被DataComponents#EQUIPPABLE取代Llama#isBodyArmorItem、getSwag被DataComponents#EQUIPPABLE取代
net.minecraft.world.itemAnimalArmorItem不再继承ArmorItem- 构造函数不再接受一个表示覆盖纹理的布尔值,因为现在这是
EquipmentModel的一部分 - 构造函数可以接受一个可选的
Holder<SoundEvent>作为装备声音 - 构造函数可以接受一个
boolean表示如果实体受伤,盔甲是否应该损坏 $BodyType现在接受允许穿戴盔甲的实体,而不是指向纹理的路径工厂
- 构造函数不再接受一个表示覆盖纹理的布尔值,因为现在这是
ArmorItem不再是可装备的- 基本上作为一个物品类,其剩余的唯一用途是在附魔时防止盔甲更换并获取关联的属性
$Type->ArmorType
ArmorMaterial->.equipment.ArmorMaterial- 基本上是一个虚拟记录,用于轻松处理应用关联的数据组件(
MAX_DAMAGE、ATTRIBUTE_MODIFIERS、ENCHANTABLE、EQUIPPABLE、REPAIRABLE)
- 基本上是一个虚拟记录,用于轻松处理应用关联的数据组件(
ArmorMaterials->.equipment.ArmorMaterialsBookItem、EnchantedBookItem->DataComponents#WRITTEN_BOOK_CONTENTBundleItem现在接受一个ResourceLocation作为模型,而不是仅仅字符串$Mutable#setSelectedItem->toggleSelectedItem
ComplexItem类已移除ElytraItem类已移除,现在只是带有DataComponents#GLIDER的物品Equippable->.equipment.Equippable,现在是一个定义物品如何装备的记录FoodOnAStackItem参数顺序已交换InstrumentItem参数顺序已交换ItemdescriptionId现在是 protectedgetDescription->getNamegetOrCreateDescriptionId已移除getDescriptionId(ItemStack)->DataComponents#ITEM_NAMEisEnchantable、getEnchantmentValue已移除isValidRepairItem已移除getDefaultAttributeModifiers已移除getDamageSource- 返回此物品对LivingEntity造成的伤害来源isComplex已移除$Propertiesequippable- 设置一个可装备组件,定义物品如何装备equippableUnswappable- 设置一个无法通过按键快捷方式交换的可装备组件。overrideDescription- 设置物品的翻译键。overrideModel- 设置模型资源位置。
getCraftingRemainingItem、hasCraftingRemainingItem->getCraftingRemainder
ItemNameBlockItem类已移除,只是一个带有useItemDescriptionPrefix属性的普通ItemItemStackITEM_NON_AIR_CODEC->Item#CODECisValidRepairItem- 返回堆栈是否可以由此堆栈修复。nextDamageWillBreak- 检查下一次受到的伤害是否会破坏物品。getDescriptionId->getItemName,不是一对一,因为现在它返回完整的组件
ShieldItem不再实现Equippable,通过DataComponents#EQUIPPABLE传入SignItem参数顺序已交换SmithingTemplateItem参数顺序已交换,移除了FeatureFlagStandingAndWallBlockItem参数顺序已交换AxeItem现在接受两个表示攻击伤害和攻击速度的浮点数DiggerItem现在接受两个表示攻击伤害和攻击速度的浮点数createAttributes->ToolMaterial#applyToolProperties
HoeItem现在接受两个表示攻击伤害和攻击速度的浮点数PickaxeItem现在接受两个表示攻击伤害和攻击速度的浮点数ShovelItem现在接受两个表示攻击伤害和攻击速度的浮点数SwordItem现在接受两个表示攻击伤害和攻击速度的浮点数createAttributes->ToolMaterial#applySwordProperties
Tier->ToolMaterialTieredItem类已移除Tiers常量存储在ToolMaterial上
net.minecraft.world.item.alchemy.Potion名称现在是必需的 -getName->name,不是一对一,因为这直接存储在药水上,没有任何其他处理net.minecraft.world.item.armortrim.*->.equipment.trim.*net.minecraft.world.item.componentTool中返回Tool$Rule的方法现在只接受HolderSet的方块,而不是列表或标签键DamageResistant- 一个组件,包含物品作为实体或穿戴时对其免疫的伤害类型标签
net.minecraft.world.item.enchantmentEnchantable- 物品附魔值的数据组件对象。Repairable- 可以修复此物品的物品的数据组件对象。
net.minecraft.world.level.blockAbstractSkullBlock不再实现EquippableEquipableCarvedPumpkinBlock类已移除,被DataComponents#EQUIPPABLE取代WoolCarpetBlock不再实现Equippable
交互结果
InteractionResult 已被完全修改,将所有内容包含在一系列密封的实现中。新的 InteractionResult 实现结合了 InteractionResultHolder 和 ItemInteractionResult,因此所有用途也已被替换。
InteractionResult 现在是一个接口,根据结果类型有四个实现。首先是 $Pass,表示交互检查应传递给调用堆栈中的下一个对象。$Fail,当用于物品和方块时,阻止调用堆栈中的任何进一步执行。对于实体,这将被忽略。最后,$TryEmptyHandInteraction 告诉调用堆栈尝试用空手应用点击,专门用于物品-方块交互。
还有 $Success,表示交互成功并且可以被消费。成功指定了两条信息:$SwingSource,表示挥动来源(CLIENT 或 SERVER)或 NONE(如果未指定),以及 $ItemContext,处理手中物品是否有交互,以及物品被转换成了什么。
这些对象都不应直接初始化。这些实现通过 InteractionResult 接口上的六个常量处理:
SUCCESS- 一个在客户端挥动手的$Success对象。SUCCESS_SERVER- 一个在服务器端挥动手的$Success对象。CONSUME- 一个不挥动手的$Success对象。FAIL- 一个$Fail对象。PASS- 一个$Pass对象。TRY_WITH_EMPTY_HAND- 一个$TryEmptyHandInteraction对象。
// 对于某个返回 InteractionResult 的方法
return InteractionResult.PASS;
对于成功对象,如果物品交互应转换持有的堆栈,则调用 $Success#heldItemTransformedTo,或者如果没有物品用于交互,则调用 $Success#withoutItem。
// 对于某个返回 InteractionResult 的方法
return InteractionResult.SUCCESS.heldItemTransformedTo(new ItemStack(Items.APPLE));
// 或者
return InteractionResult.SUCCESS.withoutItem();
net.minecraft.core.cauldron.CauldronInteractioninteract现在返回一个InteractionResultfillBucket、emptyBucket现在返回一个InteractionResult
net.minecraft.worldInteractionResultHolder、ItemInteractionResult->InteractionResult
net.minecraft.world.itemEquipable#swapWithEquipmentSlot现在返回一个InteractionResultItem#use、ItemStack#use现在返回一个InteractionResultItemUtils#startUsingInstantly现在返回一个InteractionResultJukeboxPlayable#tryInsertIntoJukebox现在返回一个InteractionResult
net.minecraft.world.level.block.state.BlockBehaviour#useItemOn、$BlockStateBase#useItemOn现在返回一个InteractionResult
乐器 数据包版
Instrument(不是 NoteBlockInstrument)现在是一个数据包注册表,意味着它们必须在 JSON 中定义或通过数据生成生成。
// 在 data/examplemod/instrument/example_instrument.json
{
// 声音事件的注册表名称
"sound_event": "minecraft:entity.arrow.hit",
// 使用乐器的秒数
"use_duration": 7.0,
// 方块范围,每个方块为 16 个单位
"range": 256.0,
// 乐器的描述
"description": {
"translate": "instrument.examplemod.example_instrument"
},
}
// 对于某个 RegistrySetBuilder builder
builder.add(Registries.INSTRUMENT, bootstrap -> {
bootstrap.register(
ResourceKey.create(Registries.INSTRUMENT, ResourceLocation.fromNamespaceAndPath("examplemod", "example_instrument")),
new Instrument(
BuiltInRegistries.SOUND_EVENT.wrapAsHolder(SoundEvents.ARROW_HIT),
7f,
256f,
Component.translatable(Util.makeDescriptionId("instrument", ResourceLocation.fromNamespaceAndPath("examplemod", "example_instrument")))
)
)
});
net.minecraft.world.itemInstrument接受一个float作为使用持续时间和一个Component描述。InstrumentItem#setRandom已移除
试炼刷怪笼配置,现在采用数据包形式
TrialSpawnConfig 现在是一个数据包注册表,意味着它们必须在 JSON 中定义或通过数据生成生成。
// 在 data/examplemod/trial_spawner/example_config.json
{
// 实体可以从试炼刷怪笼方块生成的区域范围
"spawn_range": 2,
// 可以生成的生物总数
"total_mobs": 10.0,
// 一次可以生成的生物数量
"simultaneous_mobs": 4.0,
// 试炼中每个玩家增加的生物数量
"total_mobs_added_per_player": 3.0,
// 试炼中每个玩家增加的一次可以生成的生物数量
"simultaneous_mobs_added_per_player": 2.0,
// 每次生成之间的刻数
"ticks_between_spawn": 100,
// 生成时选择的实体的加权列表
"spawn_potentials": [
{
// SpawnData
"data": {
// 要生成的实体
"entity": {
"id": "minecraft:zombie"
}
},
// 权重值
"weight": 1
}
],
// 给予奖励时选择的战利品表的权重列表
"loot_tables_to_eject": [
{
// 战利品键
"data": "minecraft:spawners/ominous/trial_chamber/key",
// 权重值
"weight": 1
}
],
// 试炼刷怪笼为不祥时使用的战利品表
"items_to_drop_when_ominous": "minecraft:shearing/bogged"
}
// 对于某个 RegistrySetBuilder builder
builder.add(Registries.TRIAL_SPAWNER_CONFIG, bootstrap -> {
var entityTag = new CompoundTag();
entityTag.putString("id", BuiltInRegistries.ENTITY_TYPE.getKey(EntityType.ZOMBIE).toString());
bootstrap.register(
ResourceKey.create(Registries.INSTRUMENT, ResourceLocation.fromNamespaceAndPath("examplemod", "example_config")),
TrialSpawnerConfig.builder()
.spawnRange(2)
.totalMobs(10.0)
.simultaneousMobs(4.0)
.totalMobsAddedPerPlayer(3.0)
.simultaneousMobsAddedPerPlayer(2.0)
.ticksBetweenSpawn(100)
.spawnPotentialsDefinition(
SimpleWeightedRandomList.single(new SpawnData(entityTag, Optional.empty(), Optional.empty()))
)
.lootTablesToEject(
SimpleWeightedRandomList.single(BuiltInLootTables.SPAWNER_OMINOUS_TRIAL_CHAMBER_KEY)
)
.itemsToDropWhenOminous(
BuiltInLootTables.BOGGED_SHEAR
)
.build()
)
});
net.minecraft.world.level.block.entity.trialspawnerTrialSpawner现在接受TrialSpawnerConfig的HoldercanSpawnInLevel现在接受一个ServerLevel
TrialSpawnerConfigCODEC->DIRECT_CODEC$Builder、builder- 试炼刷怪笼配置的构建器
配方提供者,数据提供者的“并非真正”
RecipeProvider 不再是 DataProvider。相反,通过实现 createRecipeProvider,使用 RecipeProvider$Runner 构造 RecipeProvider。还必须指定提供者的名称。
public class MyRecipeProvider extends RecipeProvider {
// 参数存储在 protected 字段中
public MyRecipeProvider(HolderLookup.Provider registries, RecipeOutput output) {
super(registries, output);
}
@Override
protected void buildRecipes() {
// 在此处注册配方
}
// runner 类,这应该作为 DataProvider 添加到 DataGenerator 中
public static class Runner extends RecipeProvider.Runner {
public Runner(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
super(output, registries)
}
@Override
protected RecipeProvider createRecipeProvider(HolderLookup.Provider registries, RecipeOutput output) {
return new VanillaRecipeProvider(registries, output);
}
@Override
public String getName() {
return "My Recipes";
}
}
}
net.minecraft.data.recipesRecipeOutput#includeRootAdvancement- 生成配方的根进度。RecipeProvider不再继承DataProvider- 构造函数接受查找提供者和一个
RecipeOutput,它们是 protected 字段 buildRecipes不接受任何参数- 所有生成方法都不接受
RecipeOutput并且是实例方法 $FamilyRecipeProvider- 通过传入结果方块和基础方块的Block为BlockFamily创建配方。$Runner- 一个DataProvider,通过createRecipeProvider构造RecipeProvider
- 构造函数接受查找提供者和一个
ShapedRecipeBuilder、ShapelessRecipeBuilder现在有私有构造函数,并接受物品的 holder getter
原料的转变
Ingredient 已被重新实现,使用 HolderSet 作为其基础,而不是其自己的内部 Ingredient$Value。这主要改变了 Ingredient#of 的调用,因为您需要为其提供 Item 对象或代表标签的 HolderSet。有关如何执行此操作的更多信息,请参阅持有者集部分。
net.minecraft.world.item.crafting.IngredientEMPTY->Ingredient#of,但默认用例不允许空原料CODEC已移除CODEC_NONEMPTY->CODECtestOptionalIngredient- 如果存在,则测试堆栈是否在原料内,否则默认为空检查。getItems->itemsgetStackingIds已移除of(ItemStack...)、of(Stream<ItemStack>)已移除of(TagKey)->of(HolderSet),需要解析标签键
BlockEntityTypes 私有化了!
BlockEntityType 已被完全私有化,构建器也被移除!这意味着,如果模组加载器或模组没有提供对构造函数的某种访问扩宽,您将无法创建新的方块实体。唯一的其他变更是,数据修复器的 Type 已被移除,意味着只需要提供客户端构造函数和方块实体可以位于的有效方块集合。
// 如果 BlockEntityType 构造函数被设为公共
// MyBlockEntity(BlockPos, BlockState) 构造函数
BlockEntityType<MyBlockEntity> type = new BlockEntityType(MyBlockEntity::new, MyBlocks.EXAMPLE_BLOCK);
消耗品
使用物品已被进一步扩展,大部分已过渡到单独的数据组件条目。
Consumable 数据组件
Consumable 数据组件定义了物品在使用完成时如何使用。这实际上起到了以前 FoodProperties 的作用,除了所有消耗逻辑都集中在这个组件中。一个消耗品有五个属性:消耗或使用物品所需的秒数、消耗时播放的动画、消耗时播放的声音、消耗期间是否应出现粒子,以及消耗完成后要应用的效果。
可以使用 food 物品属性应用 Consumable。如果只应添加 Consumable,则应调用 component。原版消耗品和构建器的列表可以在 Consumables 中找到。
// 对于某个物品
Item exampleItem = new Item(new Item.Properties().component(DataComponents.CONSUMABLE,
Consumable.builder()
.consumeSeconds(1.6f) // 将在 1.6 秒或 32 刻内使用该物品
.animation(ItemUseAnimation.EAT) // 使用时要播放的动画
.sound(SoundEvents.GENERIC_EAT) // 使用消耗品时要播放的声音
.soundAfterConsume(SoundEvents.GENERIC_DRINK) // 消耗后播放的声音(委托给 'onConsume')
.hasConsumeParticles(true) // 设置是否显示粒子
.onConsume(
// 完成消耗后,以 30% 的概率应用效果
new ApplyStatusEffectsConsumeEffect(new MobEffectInstance(MobEffects.HUNGER, 600, 0), 0.3F)
)
// 可以有多个
.onConsume(
// 在 50 格半径内随机传送实体
new TeleportRandomlyConsumeEffect(100f)
)
.build()
));
OnOverrideSound
有时,实体在消耗物品时可能想要播放不同的声音。在这种情况下,实体可以实现 Consumable$OverrideConsumeSound 并返回应播放的声音事件。
// 在您自己的实体上
public class MyEntity extends Mob implements Consumable.OverrideCustomSound {
// ...
@Override
public SoundEvent getConsumeSound(ItemStack stack) {
// 返回要播放的声音事件
}
}
ConsumableListener
ConsumableListener 是表示在堆栈被“消耗”后要应用的动作的数据组件。这意味着自从玩家开始使用消耗品以来,Consumable#consumeTicks 过去之后。这方面的一个例子是 FoodProperties。ConsumableListener 只有一个方法 #onConsume,它接受消耗发生的等级、实体、进行消耗的堆栈以及已完成消耗的 Consumable。
// 在您自己的数据组件上
public record MyDataComponent() implements ConsumableListener {
// ...
@Override
public void onConsume(Level level, LivingEntity entity, ItemStack stack, Consumable consumable) {
// 物品被消耗后执行操作。
}
}
ConsumeEffect
现在有一个数据组件处理物品被实体消耗时发生的事情,恰当地称为 ConsumeEffect。当前的效果范围从添加/移除状态效果、随机传送玩家,或仅仅播放声音。这些效果通过将效果传递给 Consumable 或构建器中的 onConsume 来应用。
// 构造消耗品时
Consumable exampleConsumable = Consumable.builder()
.onConsume(
// 完成消耗后,以 30% 的概率应用效果
new ApplyStatusEffectsConsumeEffect(new MobEffectInstance(MobEffects.HUNGER, 600, 0), 0.3F)
)
// 可以有多个
.onConsume(
// 在 50 格半径内随机传送实体
// 注意:当前有 bug,只允许 8 格半径
new TeleportRandomlyConsumeEffect(100f)
)
.build();
使用转换
消耗时将物品转换为另一个堆栈现在通过 DataComponents#USE_REMAINDER 处理。只有当使用后堆栈为空时,剩余物才会被转换。否则,它将返回当前堆栈,只是使用了一个物品。
// 对于某个物品
Item exampleItem = new Item(new Item.Properties().usingConvertsTo(
Items.APPLE // 消耗时将此物品转换为苹果
));
Item exampleItem2 = new Item(new Item.Properties().component(DataComponents.USE_REMAINDER,
new UseCooldown(
new ItemStack(Items.APPLE, 3) // 消耗时转换为三个苹果
)
));
冷却时间
物品冷却时间现在通过 DataComponents#USE_COOLDOWN 处理;然而,它们已被扩展,可以根据其定义的组对堆栈应用冷却时间。一个冷却组要么引用 Item 注册表名称(如果未指定),要么引用一个自定义资源位置。应用冷却时间时,它将冷却实例存储在匹配定义组的任何东西上。这意味着,如果某个堆栈定义了冷却组,当使用普通物品时,它不会受到影响。
// 对于某个物品
Item exampleItem = new Item(new Item.Properties().useCooldown(
60 // 等待 60 秒
// 将对 'my_mod:example_item' 组中的物品应用冷却时间(假设这是注册表名称)
));
Item exampleItem2 = new Item(new Item.Properties().component(DataComponents.USE_COOLDOWN,
new UseCooldown(
60, // 等待 60 秒
// 将对 'my_mod:custom_group' 组中的物品应用冷却时间
Optional.of(ResourceLocation.fromNamespaceAndPath("my_mod", "custom_group"))
)
));
net.minecraft.core.component.DataComponents#FOOD->CONSUMABLEnet.minecraft.world.entity.LivingEntitygetDrinkingSound、getEatingSound已移除,由ConsumeEffect处理triggerItemUseEffects已移除eat已移除
net.minecraft.world.entity.npc.WanderingTrader现在实现Consumable$OverrideConsumeSoundnet.minecraft.world.foodnet.minecraft.world.food.FoodDatatick现在接受一个ServerPlayergetLastFoodLevel、getExhaustionLevel、setExhaustion已移除
FoodProperties现在是一个ConsumableListenereatDurationTicks、eatSeconds->Consumable#consumeSecondsusingConvertsTo->DataComponents#USE_REMAINDER,effects->ConsumeEffect
net.minecraft.world.itemChorusFruitItem类已移除HoneyBottleItem类已移除ItemgetDrinkingSound、#getEatingSound已移除,由ConsumeEffect处理releaseUsing现在返回一个boolean表示是否成功释放$Properties#food现在可以接受一个Consumable用于自定义逻辑$Properties#usingConvertsTo- 使用后要转换成的物品。$Properties#useCooldown- 再次使用物品前等待的秒数。
ItemCooldowns现在接受ItemStack或ResourceLocation作为其方法的参数,而不仅仅是ItemgetCooldownGroup- 返回表示应用冷却时间的组的键
ItemStack#getDrinkingSound、getEatingSound已移除MilkBucketItem类已移除OminousBottleItem类已移除SuspiciousStewItem类已移除
net.minecraft.world.item.alchemy.PotionContents现在实现ConsumableListener- 构造函数接受一个可选的字符串,表示自定义名称的翻译键后缀
applyToLivingEntity- 将所有效果应用到提供的实体。getName- 通过将自定义名称附加到提供的内容字符串末尾来获取名称组件。
net.minecraft.world.item.componentConsumable- 一个定义何时可以消耗物品的数据组件。ConsumableListener- 应用于可被消耗的数据组件的接口,在消耗完成后执行。SuspiciousStewEffects现在实现ConsumableListenerUseCooldown- 一个定义如何应用堆栈冷却时间的数据组件。UseRemainder- 一个定义物品用完后应如何替换的数据组件。DeathProtection- 一个包含ConsumeEffect列表的数据组件,用于定义使用物品以在死亡中幸存时要执行的操作。
net.minecraft.world.item.consume_effects.ConsumeEffect- 物品完成消耗后要应用的效果。
注册表对象 ID,在属性里?
当向 Block 提供 BlockBehaviour$Properties 或向 Item 提供 Item$Properties 时,必须通过调用 #setId 直接在方块中设置 ResourceKey。如果在传入之前未设置此值,将抛出错误。
new Block(BlockBehaviour.Properties.of()
.setId(ResourceKey.create(Registries.BLOCK, ResourceLocation.fromNamespaceAndPath("examplemod", "example_block"))));
new BlockItem(exampleBlock, new Item.Properties()
.useBlockDescriptionPrefix() // 为方块物品制作描述 id
.setId(ResourceKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath("examplemod", "example_item"))));
new Item(new Item.Properties()
.setId(ResourceKey.create(Registries.ITEM, ResourceLocation.fromNamespaceAndPath("examplemod", "example_item"))));
net.minecraft.world.item.Item$PropertiessetId- 设置物品的资源键,以获取默认描述和模型。此属性必须设置。useBlockDescriptionPrefix- 使用block.前缀创建描述 id。useItemDescriptionPrefix- 使用item.前缀创建描述 id。
net.minecraft.world.level.block.state.BlockBehaviour$Properties#setId- 设置方块的资源键,以获取默认掉落和描述。此属性必须设置。
属性变更
DirectionProperty 已被移除,现在必须通过 EnumProperty#create 调用并带有 Direction 泛型来引用。此外,所有属性类都已成为 final,并且必须通过公开的 create 方法之一来构造。
net.minecraft.world.level.block.state.propertiesBooleanProperty现在是 finalDirectionProperty类已移除EnumProperty现在是 finalcreate现在接受一个List而不是Collection
IntegerProperty现在是 finalProperty#getPossibleValues现在返回一个List而不是Collection
配方,现在采用注册表格式
配方已升级为数据包注册表,类似于战利品表的处理方式。它们仍然以相同的方式查询,只是简单地使用一个伪注册表支持的实例。一些更常见的变化是,RecipeHolder 可能被 RecipeDisplayId、RecipeDisplay 或 RecipeDisplayEntry 取代,如果不需要 holder 本身的话。随之而来的是,配方书的处理方式也有一些变化。
配方书
RecipeBookComponent 已被修改,以容纳一个要渲染的菜单的泛型实例。因此,该组件不再实现 PlacedRecipe,而是接受一个代表 RecipeBookMenu 的泛型。菜单通过其构造函数传递给组件,而不是通过 init 方法。这也意味着 RecipeBookMenu 没有任何关联的泛型。要创建一个组件,需要扩展该类。
// 假设某个 MyRecipeMenu 继承 AbstractContainerMenu
public class MyRecipeBookComponent extends RecipeBookComponent<MyRecipeMenu> {
public MyRecipeBookComponent(MyRecipeMenu menu, List<RecipeBookComponent.TabInfo> tabInfos) {
super(menu, tabInfos);
// ...
}
@Override
protected void initFilterButtonTextures() {
// ...
}
@Override
protected boolean isCraftingSlot(Slot slot) {
// ...
}
@Override
protected void selectMatchingRecipes(RecipeCollection collection, StackedItemContents contents) {
// ...
}
@Override
protected Component getRecipeFilterName() {
// ...
}
@Override
protected void fillGhostRecipe(GhostSlots slots, RecipeDisplay display, ContextMap ctx) {
}
}
public class MyContainerScreen extends AbstractContainerScreen<MyRecipeMenu> implements RecipeUpdateListener {
public MyContainerScreen(MyRecipeMenu menu, List<RecipeBookComponent.TabInfo> tabInfos, ...) {
super(menu, ...);
this.recipeBookComponent = new MyRecipeBookComponent(menu, tabInfos);
}
// 完整实现请参见 AbstractFurnaceScreen
}
配方显示
但是,配方如何理解应在配方书中显示什么?这属于两个新的静态注册表:RecipeDisplay 和 SlotDisplay。
SlotDisplay 表示配方中单个槽位内显示的内容。该显示只有一个方法(忽略类型):resolve。resolve 接受包含数据的 ContextMap 和 DisplayContentsFactory,后者接受将在该槽位中显示的堆栈和剩余物。SlotDisplay 还有许多辅助实现,例如 $Composite 接受一个显示列表,或 $ItemStackSlotDisplay 接受要显示的堆栈。该显示通过其 $Type 注册,该类型接受映射编解码器和流编解码器。
槽位还有通过 resolveForStacks 和 resolveForFirstStack 获取可显示的相关堆栈的方法。
public static record MySlotDisplay() implements SlotDisplay {
@Override
public <T> Stream<T> resolve(ContextMap ctx, DisplayContentsFactory<T> output) {
// 调用 output.forStack(...) 或 addRemainder(..., ...) 使用 instanceof 来显示物品
if (output instanceof ForStacks<T> stacks) {
stacks.forStack(...);
} else if (output instanceof ForRemainders<T> remainders) {
remainders.addRemainder(..., ...);
}
}
@Override
public SlotDisplay.Type<? extends SlotDisplay> type() {
// 返回在此处注册到 Registries#SLOT_DISPLAY 的注册对象
}
}
RecipeDisplay 表示如何显示一个配方。作为实现细节,RecipeDisplay 只需要知道结果(通过 result 槽位显示)和配方使用的位置(通过 craftingStation 槽位显示),因为这是配方书关心的唯一两个细节。但是,也建议为原料设置槽位显示,然后由您的 RecipeBookComponent 消耗它们。该显示通过其 $Type 注册,该类型接受映射编解码器和流编解码器。
public record MyRecipeDisplay(SlotDisplay result, SlotDisplay craftingStation, ...) implements RecipeDisplay {
@Override
public RecipeDisplay.Type<? extends RecipeDisplay> type() {
// 返回在此处注册到 Registries#RECIPE_DISPLAY 的注册对象
}
}
配方放置
配方书中的配方原料和放置现在通过 Recipe#placementInfo 处理。PlacementInfo 基本上是一个定义配方包含的物品以及它们在菜单中应放置的位置(如果支持)的定义。如果配方无法放置,例如如果它不是 Item 或使用堆栈信息,则应返回 PlacementInfo#NOT_PLACEABLE。
PlacementInfo 可以通过 Ingredient、List<Ingredient> 或 List<Optional<Ingredient>> 使用 create 或 createFromOptionals 分别创建。
public class MyRecipe implements Recipe<RecipeInput> {
private PlacementInfo info;
public MyRecipe(Ingredient input) {
// ...
}
// ...
@Override
public PlacementInfo placementInfo() {
// 这种委托是因为支持原料的 HolderSet 可能在构造函数中没有完全填充
if (this.info == null) {
this.info = PlacementInfo.create(input);
}
return this.info;
}
}
如果使用 Optional<Ingredient>,可以通过 Ingredient#testOptionalIngredient 进行测试。
net.minecraft.world.item.craftingIngredient#display- 返回显示此原料的SlotDisplay。PlacementInfo- 定义构造配方结果所需的所有原料。RecipegetToastSymbol->getCategoryIconItemgetIngredients、isIncomplete->placementInfogetIngredients->PlacementInfo#stackedRecipeContents,isIncomplete->PlacementInfo#isImpossibleToPlace
RecipeManager#getSynchronizedRecipes- 返回所有可以放置的配方并将它们发送到客户端。没有其他配方被同步。ShapedRecipePattern现在接受一个List<Optional<Ingredient>>而不是NonNullList<Ingredient>ShapelessRecipe现在接受一个List<Ingredient>而不是NonNullList<Ingredient>SmithingTransformRecipe、SmithingTrimRecipe现在接受Optional<Ingredient>而不是IngredientSuspiciousStewRecipe类已移除
配方变更
配方类本身有一些变化,它们反映了上述所有变化。首先,canCraftInDimensions 已移除,现在硬编码到匹配函数中。getResultItem 和 getCategoryIconItem 已被 RecipeDisplay 通过 display 取代。getRemainingItems 已移至 CraftingRecipe。最后,所有配方现在通过 recipeBookCategory 返回它们的 RecipeBookCategory。
public class MyRecipe implements Recipe<RecipeInput> {
@Override
public String group() {
// 在此处返回之前 `getGroup` 的内容
}
@Override
public List<RecipeDisplay> display() {
return List.of(
// 某个 RecipeDisplay 实例
// RecipeDisplay#result 应返回 `getResultItem`
// RecipeDisplay#craftingStation 应返回 `getCategoryIconItem`
)
}
@Override
public RecipeBookCategory recipeBookCategory() {
// 功能类似于数据生成期间传递给配方构建器的书类别
return RecipeBookCategories.CRAFTING_MISC;
}
}
创建配方书类别
配方书类别通过 ExtendedRecipeBookCategory 统一,并分为两个部分:RecipeBookCategory 用于实际类别,以及 SearchRecipeBookCategory 用于聚合类别。SearchRecipeBookCategory 是枚举,而 RecipeBookCategory 像任何其他静态注册表对象一样。这是通过创建一个新的 RecipeBookCategory 来完成的。
// 使用标准的原版注册表方法
public static final RecipeBookCategory EXAMPLE_CATEGORY = Registry.register(
BuiltInRegistries.RECIPE_BOOK_CATEGORY,
// 注册表对象名称
ResourceLocation.fromNamespaceAndPath("examplemod", "example_category"),
// 这将创建一个新的配方书类别。它作为一个标记对象。
new RecipeBookCategory()
);
技术性变更
net.minecraft.advancements.AdvancementRewards现在接受一个ResourceKey列表而不是ResourceLocation作为配方$Builder#recipe、addRecipe现在接受一个ResourceKey
net.minecraft.advancements.critereonPlayerPredicate现在接受一个ResourceKey作为配方映射$Builder#addRecipe现在接受一个ResourceKey
RecipeCraftedTriggertrigger现在接受一个ResourceKey$TriggerInstance现在接受一个ResourceKey$TriggerInstance#craftedItem、crafterCraftedItem现在接受一个ResourceKey
RecipeUnlockedTriggerunlocked现在接受一个ResourceKey$TriggerInstance现在接受一个ResourceKey
net.minecraft.clientClientRecipeBooksetupCollections->rebuildCollections,不是一对一getCollection(RecipeBookCategories)->getCollection(ExtendedRecipeBookCategory)add、remove- 处理在配方书中添加/移除要显示的配方条目。addHighLight、removeHighlight、hasHighlight- 处理当被玩家过滤或选择时条目是否高亮显示。clear- 清除已知和高亮显示的配方。
RecipeBookCategories#*_MISC->SearchRecipeBookCategory#*- 这也可以在方法中被
RecipeBookComponent$TabInfo、ExtendedRecipeBookCategory或RecipeBookCategory取代
- 这也可以在方法中被
net.minecraft.client.gui.components.toastsRecipeToast(RecipeHolder)->RecipeToast(),现在是私有的addOrUpdate现在接受一个RecipeDisplay而不是RecipeHolder
net.minecraft.client.gui.screens.inventory.AbstractFurnaceScreenrecipeBookComponent现在是私有的AbstractFurnaceScreen(T, AbstractFurnaceRecipeBookComponent, Inventory, Component, ResourceLocation, ResourceLocation, ResourceLocation)-AbstractFurnaceRecipeBookComponent已被Component取代,因为配方书不是在内部构造的,并且现在接受一个RecipeBookComponent$TabInfo列表
net.minecraft.client.gui.screens.recipebookAbstractFurnaceReipceBookComponent、BlastingFurnaceReipceBookComponent、SmeltingFurnaceReipceBookComponent、SmokingFurnaceReipceBookComponent->FurnaceReipceBookComponentGhostRecipe->GhostSlots,不是一对一,因为配方本身作为RecipeHolder存储在RecipeBookComponent的一个私有字段中addResult->setResult,不是一对一addIngredient->setIngredient,不是一对一setSlot、setInput、setResult现在接受一个ContextMap
OverlayRecipeComponent()->OverlayRecipeComponent(SlotSelectTime, boolean)init接受一个包含注册表数据的ContextMap以在组件中显示,以及一个boolean表示配方书是否正在过滤,而不是从Minecraft实例计算getLastRecipeClicked现在返回一个RecipeDisplayId$OverlayRecipeButton现在是一个抽象的包私有类,接受ContextMap$Pos现在是一个记录
RecipeBookComponent不再实现RecipeShownListener- 构造函数接受一个
$TabInfo列表,其中包含书中显示的标签页 init不再接受一个RecipeBookMenuinitVisuals现在是私有的initFilterButtonTextures现在是抽象的updateCollections现在接受另一个布尔值,表示书是否正在过滤renderTooltip现在接受一个可为 null 的Slot而不是一个表示槽位索引的intrenderGhostRecipe不再接受一个表示延迟时间的floatsetupGhostRecipe->fillGhostRecipe,不再接受要放置的List<Slot>,这存储在组件本身中selectMatchingRecipes不再接受RecipeBookrecipesShown现在接受一个RecipeDisplayIdsetupGhostRecipeSlots->fillGhostRecipe,接受ContextMap$TabInfo- 一个记录,表示配方书页面中要显示的图标和配方类别。
- 构造函数接受一个
RecipeBookPage()->RecipeBookPage(RecipeBookComponent, SlotSelectTime, boolean)updateCollections现在接受一个布尔值,表示书是否正在过滤getMinecraft已移除addListener已移除getLastRecipeClicked现在返回一个RecipeDisplayIdrecipesShown现在接受一个RecipeDisplayIdgetRecipeBook现在返回一个ClientRecipeBook
RecipeBookTabButton现在接受一个RecipeBookComponent$TabInfostartAnimation(Minecraft)->startAnimation(ClientRecipeBook, boolean)getCategory现在返回一个ExtendedRecipeBookCategory
RecipeButton()->RecipeButton(SlotSelectTime)init现在接受一个boolean表示书是否正在过滤,以及一个ContextMap保存注册表数据getRecipe->getCurrentRecipe,不是一对一getDisplayStack- 返回配方的结果堆栈。getTooltipText现在接受ItemStack
RecipeCollection(RegistryAccess, List<RecipeHolder>)->RecipeCollection(List<RecipeDisplayEntry>)canCraft->selectRecipesgetRecipes、getDisplayRecipes->getSelectedRecipesregistryAccess、hasKnownRecipes、updateKnownRecipes已移除isCraftable现在接受一个RecipeDisplayIdhasFitting->hasAnySelectedgetRecipes现在返回一个RecipeDisplayEntry列表
RecipeShownListener类已移除RecipeUpdateListenergetRecipeBookComponent已移除fillGhostRecipe-> 给定RecipeDisplay填充幽灵配方
SearchRecipeBookCategory- 一个枚举,包含聚合类型的配方书类别。SlotSelectTime- 表示玩家选择的当前槽位索引。
net.minecraft.client.multiplayerClientPacketListener#getRecipeManager->recipes,返回RecipeAccessClientRecipeContainer- 当从服务器同步时,RecipeAccess的客户端实现。MultiPlayerGameMode#handlePlaceRecipe现在接受一个RecipeDisplayIdSessionSearchTrees#updateRecipes现在接受一个Level而不是RegistryAccess$Frozen
net.minecraft.client.player.LocalPlayer#removeRecipeHightlight现在接受一个RecipeDisplayIdnet.minecraft.commands.SharedSuggestionProvider#getRecipeNames已移除,因为它可以从注册表访问中查询net.minecraft.commands.arguments.ResourceLocationArgumentgetRecipe->ResourceKeyArgument#getRecipegetAdvancement->ResourceKeyArgument#getAdvancement
net.minecraft.commands.synchronization.SuggestionProviders#ALL_RECIPES已移除net.minecraft.core.component.DataComponents#RECIPES现在接受一个ResourceKey列表net.minecraft.data.recipesRecipeBuilder#save现在接受一个ResourceKey而不是ResourceLocationRecipeOutput#accept现在接受一个ResourceKey而不是ResourceLocationRecipeProvider#trimSmithing现在接受一个ResourceKey而不是ResourceLocation
net.minecraft.network.protocol.gameClientboundPlaceGhostRecipePacket- 一个包含容器 id 和RecipeDisplay的数据包ClientboundRecipeBookAddPacket- 向配方书添加条目的数据包ClientboundRecipeBookRemovePacket- 从配方书移除条目的数据包ClientboundRecipeBookSettingsPacket- 指定配方书设置的数据包ClientboundRecipePacket类已移除ClientboundUpdateRecipesPacket现在是一个记录,接受配方的属性集和切石机配方getRecipes已移除
ServerboundPlaceRecipePacket现在是一个记录ServerboundRecipeBookSeenRecipePacket现在是一个记录
net.minecraft.recipebookPlaceRecipe->PlaceRecipeHelperaddItemToSlot->$Output#addItemToSlotplaceRecipe现在接受一个Recipe而不是RecipeHolder- 有一个重载接受两个额外的 int,表示
ShapedRecipe的模式高度和宽度,或者只是重复前两个 int
- 有一个重载接受两个额外的 int,表示
RecipeBookadd、contains、remove->ServerRecipeBook#add、contains、removeaddHighlight、removeHighlight、willHighlight->ServerRecipeBook#addHighlight、removeHighlight、ClientRecipeBook#hasHighlightbookSettings现在是 protected
RecipeBookSettings#read、write现在是私有的ServerPlaceRecipe不再直接可访问,而是通过#placeRecipe作为RecipeBookMenu$PostPlaceAction访问和返回$CraftingMenuAccess- 定义如何与可放置配方菜单进行交互。
ServerRecipeBookfromNbt现在接受一个ResourceKey的谓词而不是RecipeManagercopyOverData- 从另一个配方书读取数据。$DisplayResolver- 通过传入RecipeDisplayEntry来解析要显示的配方
net.minecraft.stats.RecipeBook#isFiltering(RecipeBookMenu)已移除net.minecraft.world.entity.playerPlayer#awardRecipesByKey现在接受一个ResourceKey列表StackedItemContents#canCraft接受原料信息列表的重载
net.minecraft.world.inventoryAbstractCraftingMenu- 一个用于合成界面的菜单。AbstractFurnaceMenu现在接受RecipePropertySet键CraftingMenu#slotChangedCraftingGrid现在接受一个ServerLevel而不是LevelItemCombinerMenu现在接受一个ItemCombinerMenuSlotDefinitionmayPickup现在默认为true
ItemCombinerMenuSlotDefinition#hasSlot、getInputSlotIndexes已移除RecipeBookMenu不再接受任何泛型handlePlacement现在是抽象的,并返回一个$PostPlaceAction,接受一个额外的ServerLevel- 这将移除所有基本的配方放置调用,因为这将在内部由
ServerPlaceRecipe处理
- 这将移除所有基本的配方放置调用,因为这将在内部由
RecipeCraftingHolder#setRecipeUser不再接受一个LevelSmithingMenu#hasRecipeError- 返回当物品放置在库存中时配方是否有错误。
net.minecraft.world.item.craftingAbstractCookingRecipe现在实现SingleItemRecipe- 构造函数不再接受
RecipeType,因此用户需要覆盖getType方法 getExperience->experiencegetCookingTime->cookingTimefurnaceIcon- 返回炉子的图标。$Serializer- 烹饪配方序列化器实例的便利实现。
- 构造函数不再接受
CookingBookCategory现在有一个整数 idCraftingRecipe#defaultCrafingRemainder- 获取合成配方中应保留的堆栈。CustomRecipe$Serializer- 自定义配方序列化器实例的便利实现。ExtendedRecipeBookCategory- 表示配方书内类别的统一接口。Ingredient#optionalIngredientToDisplay- 将可选原料转换为SlotDisplay。Recipe#getRemainingItems->CraftingRecipe#getRemainingItemsRecipeAccess- 一个访问器,返回包含可用配方输入的属性集。RecipeBookCategory- 表示配方书内单个类别的对象。RecipeCache#get现在接受一个ServerLevel而不是LevelRecipeHolder现在接受一个ResourceKeyRecipeManager现在继承SimplePreparableReloadLsitener<RecipeMap>并实现RecipeAccessprepare- 从配方注册表创建配方映射logImpossibleRecipes、hasErrorsLoading已移除getRecipeFor现在接受一个ResourceKey,之前是ResourceLocationgetRecipesFor、getAllRecipesFor->RecipeMap#getRecipesForbyType已移除getRemainingItemsFor已移除byKey、byKeyTyped现在接受一个ResourceKeygetOrderedRecipes已移除getSynchronizedRecipes->getSynchronizedItemProperties、getSynchronizedStonecutterRecipes;不是一对一getRecipeIds已移除getRecipeFromDisplay- 根据其 id 获取配方显示信息。listDisplaysForRecipe- 接受要显示的配方的显示条目列表。replaceRecipes已移除$CachedCheck#getRecipeFor现在接受一个ServerLevel而不是Level$IngredientCollector- 一个从配方中提取原料并将其添加到RecipePropertySet的配方消费者$IngredientExtractor- 一个在存在时获取配方的原料的方法。$ServerDisplayInfo- 一个将显示条目链接到其配方持有者的记录。
RecipeMap- 一个通过配方类型和资源键映射配方持有者的类。RecipePropertySet- 一组可用作给定配方槽位输入的原料。用于只允许特定输入到屏幕上的槽位。SelectableRecipe- 一个包含槽位显示及其关联配方的记录。目前仅用于切石机菜单。SimpleCookingSerializer->AbstractCookingRecipe$SerializerSingleItemRecipe不再接受RecipeType或RecipeSerializeringredient、result、group现在是私有的input、result- 配方的槽位。
net.minecraft.world.item.crafting.displayDisplayContentsFactory- 用于接受配方内容的一个工厂。其子类型接受配方的堆栈和剩余物。RecipeDisplay- 用于显示配方内容的显示处理器。RecipeDisplayEntry- 一个将配方显示链接到其标识符、类别和合成需求的记录。RecipeDisplayId- 配方显示的标识符。SlotDisplay- 用于显示配方内槽位内容的显示处理器。SlotDisplayContext- 槽位显示使用的上下文键。
net.minecraft.world.level.Level#getRecipeManager->recipeAccess,在Level上返回RecipeAccess,但在ServerLevel上返回RecipeManagernet.minecraft.world.level.block.CrafterBlock#getPotentialResults现在接受一个ServerLevel而不是Levelnet.minecraft.world.level.block.entity.CampfireBlockEntitygetCookableRecipe已移除placeFood现在接受一个ServerLevel而不是Level
小幅迁移
以下是有用或有趣的增加、变更和移除的列表,它们不值得在入门文档中拥有自己的章节。
语言文件的移除与重命名
assets/minecraft/lang 中翻译键的所有移除和重命名现在显示在 deprecated.json 中。
条件,通过 HolderGetter 提供
在构造期间,所有条件构建器现在都接受一个 HolderGetter。虽然这可能不会被使用,但这是用来代替直接调用静态注册表来获取关联的 Holder 和 HolderSet。
net.minecraft.advancement.critereonBlockPredicate$Builder#ofConsumeItemTrigger$TriggerInstance#usedItemEntityEquipmentPredicate#captainPredicateEntityPredicate$Builder#ofEntityTypePredicate#ofItemPredicate$Builder#ofPlayerTrigger$TriggerInstance#walkOnBlockWithEquipmentShotCrossbowTrigger$TriggerInstance#shotCrossbowUsedTotemTrigger$TriggerInstance#usedToItem
MacosUtil#IS_MACOS
com.mojang.blaze3d.platform.MacosUtil#IS_MACOS 已被添加,以替换在渲染过程中指定布尔值。
com.mojang.blaze3d.pipelineRenderTarget#clear(boolean)->clear()TextureTarget(int, int, boolean, boolean)->TextureTarget(int, int, boolean)
com.mojang.blaze3d.platform.GlStateManager#_clear(boolean)->_clear()com.mojang.blaze3d.systems.RenderSystem#clear(int, boolean)->clear(int)
雾参数
单个值的雾方法已被 FogParameters 数据对象取代。
com.mojang.blaze3d.systems.RenderSystemsetShaderFogStart、setShaderFogEnd、setShaderFogColor、setShaderFogShape->setShaderFoggetShaderFogStart、getShaderFogEnd、getShaderFogColor、getShaderFogShape->getShaderFog
net.minecraft.client.renderer.FogRenderersetupColor->computeFogColor,返回一个Vector4fsetupNoFog->FogParameters#NO_FOGsetupFog现在接受一个Vector4f作为颜色,并返回FogParameterslevelFogColor已移除
新标签
minecraft:banner_patternbordure_indentedfield_masoned
minecraft:blockbats_spawnable_onpale_oak_logs
minecraft:damage_typemace_smash
minecraft:itemdiamond_tool_materialsfurnace_minecart_fuelgold_tool_materialsiron_tool_materialsnetherite_tool_materialsvillager_picks_upwooden_tool_materialspiglin_safe_armorrepairs_leather_armorrepairs_chain_armorrepairs_iron_armorrepairs_gold_armorrepairs_diamond_armorrepairs_netherite_armorrepairs_turtle_helmetrepairs_wolf_armorduplicates_allaysbrewing_fuelpanda_eats_from_groundshulker_boxesbundlesmap_invisibility_equipmentpale_oak_logsgaze_disguise_equipment
minecraft:entity_typeboat
更智能的帧率限制
不再仅仅在玩家不在等级中或在屏幕或覆盖层中时限制帧率,而是根据不同的动作有不同的行为。这是通过 FramerateLimitTracker 使用 InactivityFpsLimit 完成的。这增加了两个额外的检查。如果窗口最小化,游戏以 10 fps 运行。如果用户一分钟没有输入,那么游戏以 30 fps 运行。十分钟没有输入后为 10 fps。
com.mojang.blaze3d.platform.FramerateLimitTracker- 一个根据设定值限制帧率的跟踪器。com.mojang.blaze3d.platform#Window#setFramerateLimit、getFramerateLimit已移除net.minecraft.clientInactivityFpsLimit- 一个枚举,定义了当窗口最小化或玩家离开键盘时如何限制 FPS。Minecraft#getFramerateLimitTracker- 返回帧率限制器。
燃料值
FuelValues 已取代 AbstractFurnaceBlockEntity 中的静态映射。它的功能与该映射相同,只是燃料值存储在 MinecraftServer 本身上,并可提供给单个 Level 实例。可以通过访问 MinecraftServer 或 Level 并调用 fuelValues 方法来获取映射。
net.minecraft.client.multiplayer.ClientPacketListener#fuelValues- 返回燃料的燃烧时间。net.minecraft.server.MinecraftServer#fuelValues- 返回燃料的燃烧时间。net.minecraft.server.level.Level#fuelValues- 返回燃料的燃烧时间。net.minecraft.world.level.block.entityAbstractFurnaceBlockEntityinvalidateCache、getFuel->Level#fuelValuesgetBurnDuration现在接受FuelValuesisFuel->FuelValues#isFuel
FuelValues- 一个包含燃料物品列表及其关联燃烧时间的类
发光强度
发光强度数据现在被烘焙到四边形中,可以使用 light_emission 标签添加到面中。
net.minecraft.client.renderer.block.modelBakedQuad现在接受一个int表示发光强度getLightEmission- 返回四边形的发光强度。
BlockElement现在接受一个int表示发光强度FaceBakery#bakeQuad现在接受一个int表示发光强度
地图纹理
地图纹理现在通过 MapTextureManager(处理动态纹理)和 MapRenderer(处理地图渲染)来处理。地图装饰仍然通过 map_decorations 精灵文件夹加载。
net.minecraft.clientMinecraftgetMapRenderer- 获取地图的渲染器。getMapTextureManager- 获取地图的纹理管理器。
net.minecraft.client.resources#MapTextureManager- 处理为地图创建动态纹理。net.minecraft.client.gui.MapRenderer->net.minecraft.client.renderer.MapRenderernet.minecraft.client.renderer#GameRenderer#getMapRenderer->Minecraft#getMapRenderer
朝向
随着红石线实验的加入,邻居变化带来了一个新类:Orientation。Orientation 实际上是两个方向和一个侧面偏置的组合。Orientation 用作一种方式,根据上下文的连接方向和偏置来传播更新。目前,这对不使用新红石线系统的人来说没有任何意义,因为所有对邻居方法的其他调用都将其设置为 null。然而,它确实提供了一种简单的方法来逐步传播行为。
net.minecraft.client.renderer.debug.RedstoneWireOrientationsRenderer- 红石线朝向的调试渲染器。net.minecraft.world.level.LevelupdateNeighborsAt- 使用指定的Orientation更新给定位置的邻居。updateNeighborsAtExceptFromFacing、neighborChanged现在接受一个Orientation
net.minecraft.world.level.block.RedStoneWireBlockgetBlockSignal- 返回方块信号的强度。
net.minecraft.world.level.block.state.BlockBehaviourneighborChanged、$BlockStateBase#handleNeighborChanged现在接受一个Orientation而不是邻居BlockPosupdateShape现在接受LevelReader、ScheduledTickAccess和RandomSource而不是LevelAccessor;Direction和BlockState参数的顺序已重新排列$BlockStateBase#updateShape现在接受LevelReader、ScheduledTickAccess和RandomSource而不是LevelAccessor;Direction和BlockState参数的顺序已重新排列
net.minecraft.world.level.redstoneCollectingNeighborUpdater$ShapeUpdate#state->neighborStateNeighborUpdaterneighborChanged、updateNeighborsAtExceptFromFacing、executeUpdate现在接受一个Orientation而不是邻居BlockPosexecuteShapeUpdate交换了BlockState和邻居BlockPos的顺序
Orientation- 方块上连接Direction的一组,并偏向正面或上面。RedstoneWireEvaluator- 传入和传出信号的强度评估器。
矿车行为
矿车现在有一个 MinecartBehavior 类,处理实体应如何移动和渲染。
net.minecraft.core.dispenser.MinecartDispenseItemBehavior- 定义矿车在从发射器发射时应如何表现。net.minecraft.world.entity.vehicleAbstractMinecartgetMinecartBehavior- 返回矿车的行为。exits现在是公开的isFirstTick- 返回这是否是实体存活的第一个刻。getCurrentBlockPosOrRailBelow- 获取矿车的当前位置或下方的铁轨。moveAlongTrack->makeStepAlongTracksetOnRails- 设置矿车是否在铁轨上。isFlipped、setFlipped- 返回矿车是否倒置。getRedstoneDirection- 返回红石供电的方向。isRedstoneConductor现在是公开的applyNaturalSlowdown现在返回要减速的向量。getPosOffs->MinecartBehavior#getPossetInitialPos- 设置矿车的初始位置。createMinecart在其创建中现在是抽象的,意味着它可以用于根据提供的参数创建任何矿车getMinecartType已移除getPickResult现在是抽象的$Type和getMinecartType被isRideable和isFurnace取代,不是一对一。
AbstractMinecartContainer(EntityType, double, double, double, Level)已移除MinecartBehavior- 包含实体在移动过程中应如何渲染和定位。MinecartFurnace#xPush、zPush->push
net.minecraft.world.level.block.state.properties.RailShape#isAscending->isSlopenet.minecraft.world.phys.shapes.MinecartCollisionContext- 处理矿车与其他碰撞对象碰撞的实体碰撞上下文。
爆——炸——!
Explosion 现在是一个定义爆炸元数据的接口。它不包含任何实际爆炸自身的方法。然而,ServerExplosion 仍然在内部用于处理等级爆炸等。
net.minecraft.world.levelExplosion->ServerExplosionExplosion- 一个定义爆炸应如何发生的接口。getDefaultDamageSource- 返回爆炸实例的默认伤害来源。shouldAffectBlocklikeEntities- 返回方块实体是否应受到爆炸影响。level- 获取ServerLevel
ExplosionDamageCalculator#getEntityDamageAmount现在接受一个额外的float表示所见百分比Level#explode不再返回任何内容
net.minecraft.world.level.block.Block#wasExploded现在接受一个ServerLevel而不是Levelnet.minecraft.world.level.block.state.BlockBehaviour#onExplosionHit、$BlockStateBase#onExplosionHit现在接受一个ServerLevel而不是Level
移除雕刻生成步骤
GenerationStep$Carving 已被移除,意味着所有 ConfiguredWorldCarver 都作为单个 HolderSet 提供。
// 在某个 BiomeGenerationSettings JSON 中
{
"carvers": [
// 在此处放置雕刻器
]
}
net.minecraft.world.level.biome.BiomeGenerationSettingsgetCarvers不再接受GenerationStep$Carving$Builder#addCarver不再接受GenerationStep$Carving$PlainBuilder#addCarver不再接受GenerationStep$Carving
net.minecraft.world.level.chunkChunkGenerator#applyCarvers不再接受GenerationStep$CarvingProtoChunk#getCarvingMask、getOrCreateCarvingMask、setCarvingMask不再接受GenerationStep$Carving
net.minecraft.world.level.levelgen.placementCarvingMaskPlacement类已移除PlacementContext#getCarvingMask不再接受GenerationStep$Carving
可编解码的 JSON 重载监听器
SimpleJsonResourceReloadListener 已被重写,使用编解码器而不是纯 Gson。
public class MyJsonListener extends SimpleJsonResourceReloadListener<MyJsonObject> {
// 如果不需要注册表访问,可以移除 HolderLookup$Provider 参数
public MyJsonListener(HolderLookup.Provider registries, Codec<T> codec, String directory) {
super(registries, codec, directory);
}
}
net.minecraft.server.packs.resources.SimpleJsonResourceReloadListener现在接受一个代表 JSON 数据对象的泛型- 构造函数现在是 protected,接受数据对象的编解码器、目录的字符串,以及一个可选的
HolderLookup$Provider以在必要时构造RegistryOps序列化上下文 prepare现在返回一个名称到对象的映射scanDirectory现在接受DynamicOps和Codec
- 构造函数现在是 protected,接受数据对象的编解码器、目录的字符串,以及一个可选的
连续执行器
ProcessorMailbox 和 ProcessorHandle 已被分别替换为 AbstractConsecutiveExecutor 和 TaskScheduler。它们在使用上基本相同,只是可能方法名称不同。
net.minecraft.util.threadProcessorMailbox->AbstractConsecutiveExecutor,不是一对一ConsecutiveExecutor将是等效的实现
PriorityConsecutiveExecutor- 一个指定调度时任务优先级的执行器。BlockableEventLoop#wrapRunnable->AbstractConsecutiveExecutor#wrapRunnableProcessorHandle->TaskScheduler,其中泛型是Runnable的子类型tell->scheduleask、askEither->scheduleWithResult,不是一对一of->wrapExecutor
StrictQueue不再接受F泛型,并使T成为Runnable的子类型pop现在返回一个Runnable$IntRunnable->$RunnableWithPriority
生物转化
通过 #convertTo 转化的生物,其逻辑由 ConversionType、ConversionParams 处理。ConversionType 是一个枚举,指示通过 #convert 将信息从一个生物复制到另一个生物时要应用的逻辑。常见属性通过 #convertCommon 处理,该方法在 #convert 方法内部调用。目前有两种类型:SINGLE,其中实体一对一地转换为另一个实体;以及 SPLIT_ON_DEATH,其中 Mob#convertTo 方法被多次调用,例如当史莱姆死亡时。ConversionParams 包含关于转化过程的元数据:类型、实体是否可以保留其装备或拾取战利品,以及实体所在的队伍。Mob#convertTo 还接受一个生物消费者,用于对实体本身应用任何最终化设置。
// 对于某个 Mob exampleMob
exampleMob.convertTo(
EntityType.SHEEP, // 要转化成的实体
new ConversionParams(
ConversionType.SINGLE, // 一对一
true, // 保留装备
false // 不保留拾取战利品
),
EntitySpawnReason.CONVERSION, // 实体生成原因
sheep -> {
// 对新建的转化实体执行任何其他设置
},
)
net.minecraft.world.entityConversionParams- 一个包含当生物转化为另一个实体时发生什么的设置的记录ConversionType- 一个枚举,定义一个生物如何转化为另一个生物。目前要么是SINGLE用于一对一,要么是SPLIT_ON_DEATH用于一对多(仅用于史莱姆)Mob#convertTo现在接受ConversionParams、一个可选的实体EntitySpawnReason(默认为CONVERSION),以及一个用于在转化后设置任何其他信息的生物消费者
末影珍珠加载区块
末影珍珠现在通过向区块源添加一个加载票并将实体存储在玩家上来加载它们穿过的区块。
net.minecraft.server.level.ServerPlayerregisterEnderPearl、deregisterEnderPearl、getEnderPearls- 处理玩家投掷的末影珍珠。registerAndUpdateEnderPearlTicket、placeEnderPearlTicket- 处理投掷的末影珍珠的区域加载票。
分析器与 Tracy 客户端
分析器已与 Minecraft 实例分离,现在通过 Profiler#get 获得。可以通过 Profiler#use 上的 try-resource 块添加一个新的分析器实例。此外,分析器添加了一个名为 Tracy 的新库,用于跟踪当前堆栈帧以及捕获屏幕上的图像,如果传入了关联的 --tracy 参数。这些部分可以拆分为“区域”,以更细粒度地区分正在发生的事情。
Profiler.get().push("section");
// 在此处执行代码
Profiler.get().pop();
com.mojang.blaze3d.systems.RenderSystem#flipFrame现在接受一个TracyFrameCapture,或nullnet.minecraft.client.Minecraft#getProfiler->Profiler#getnet.minecraft.client.main.GameConfig$GameData现在接受一个布尔值,表示是否通过 tracy 客户端捕获屏幕。net.minecraft.client.multiplayer.ClientLevel不再接受ProfilerFillernet.minecraft.server.MinecraftServer#getProfiler->Profiler#getnet.minecraft.server.packs.resources.PreparableReloadListener#reload不再接受ProfilerFillernet.minecraft.util.profilingProfiler- 一个用于管理当前活动ProfilerFiller的静态处理器。ProfilerFilleraddZoneText- 添加文本以在分析当前帧时标记。addZoneValue- 在分析当前帧时添加区域的值。setZoneColor- 在分析当前帧时设置区域的颜色。zone- 添加一个分析器部分,同时创建一个新区域来调用上述方法。tee->combine$CombinedProfileFiller- 一个写入多个分析器的分析器。
TracyZoneFiller- 由 tracy 客户端使用的分析器,用于跟踪当前正在分析的区域。Zone- 当前正在被 Tracy 分析和解释的部分。
net.minecraft.world.entity.ai.goal.GoalSelector不再接受提供的ProfilerFillernet.minecraft.world.levelLevel不再接受ProfilerFillergetProfiler、getProfilerSupplier->Profiler#get
PathNavigationRegion#getProfiler->Profiler#get
net.minecraft.world.ticks.LevelTicks不再接受ProfilerFiller
Tick节流器
为了防止玩家垃圾邮件某些动作,添加了 TickThrottler。节流器接受阈值和要添加到计数的增量。如果计数小于阈值,则可以发生该动作。计数每刻减少。
net.minecraft.util.TickThrottler- 一个用于限制某些动作发生频率的工具。
上下文键
战利品上下文参数已被上下文键取代,这只是对之前类的一个更通用的命名方案。这也导致上下文键用于可能有任意数据的其他上下文中。
简要描述,上下文键系统实际上是一个通用的类型化字典,其中每个 ContextKey 保存值类型,然后存储在 ContextMap 中的后备映射中。为了强制执行必需和可选参数,ContextMap 使用 ContextKeySet 构建,它定义了字典映射的键。
net.minecraft.advancements.critereon.CriterionValidator#validate现在接受一个ContextKeySet而不是LootContextParamSetnet.minecraft.data.loot.LootTableProvider$SubProviderEntry#paramSet现在接受一个ContextKeySet而不是LootContextParamSetnet.minecraft.util.contextContextKey- 一个表示对象的键。可以把它看作一个指定值类型的字典键。ContextKeySet- 一个键集,指示后备字典必须具有哪些键,以及可以指定的可选键。ContextMap- 上下文键到其类型化对象的映射。
net.minecraft.world.item.enchantmentConditionalEffect#codec现在接受一个ContextKeySet而不是LootContextParamSetTargetedConditionalEffect#codec现在接受一个ContextKeySet而不是LootContextParamSet
net.minecraft.world.level.storage.lootLootContexthasParam->hasParametergetParam->getParametergetParamOrNull-getOptionalParameter$EntityTraget#getParam现在返回一个ContextKey而不是LootContextParam
LootContextUser#getReferencedContextParams现在接受一组ContextKey而不是一组LootContextParamLootParams现在接受一个ContextMap而不是参数到对象的映射hasParam、getParameter、getOptionalParameter、getParamOrNull可以通过ContextMap以不同的名称访问$Builder#withParameter、withOptionalParameter、getParameter、getOptionalParameter现在接受一个ContextKey而不是LootContextParam$Builder#create现在接受一个ContextKeySet而不是LootContextParamSet
LootTablegetParameSet现在返回一个ContextKeySet而不是LootContextParamSet$Builder#setParamSet现在接受一个ContextKeySet而不是LootContextParamSet
ValidationContext现在接受一个ContextKeySet而不是LootContextParamSetvalidateUser->validateContextUsagesetParams-setContextKeySet
net.minecraft.world.level.storage.loot.functionsCopyComponentsFunction$Source#getReferencedContextParams现在接受一组ContextKey而不是一组LootContextParam
net.minecraft.world.level.storage.loot.parametersLootContextParam->net.minecraft.util.context.ContextKeyLootContextParamSet->net.minecraft.util.context.ContextKeySet
net.minecraft.world.level.storage.loot.providers.nbtContextNbtProvider$Getter#getReferencedContextParams现在接受一组ContextKey而不是一组LootContextParamNbtProvider#getReferencedContextParams现在接受一组ContextKey而不是一组LootContextParam
net.minecraft.world.level.storage.loot.providers.score.ScoreboardNameProvider#getReferencedContextParams现在接受一组ContextKey而不是一组LootContextParam
新增列表
com.mojang.blaze3d.framegraphFrameGraphBuilder- 一个构建帧图的构建器,定义渲染使用的资源和帧通道。FramePass- 一个接口,定义如何在帧图内读取/写入资源并执行它们进行渲染。
com.mojang.blaze3d.platformClientShutdownWatchdog- 为客户端关闭时创建的一个看门狗。NativeImage#getPixelsABGR- 以 ABGR 格式获取图像的像素。WindowisIconified- 返回窗口当前是否被图标化(通常最小化到任务栏)。setWindowCloseCallback- 设置窗口关闭时要运行的回调。
com.mojang.blaze3d.resourceCrossFrameResourcePool- 处理应跨多帧渲染的资源GraphicsResourceAllocator- 处理要渲染和移除的资源。RenderTargetDescriptor- 定义要分配和释放的渲染目标。ResourceDescriptor- 定义一个资源以及如何分配和释放它。ResourceHandle- 定义一个指向单个资源的指针。
com.mojang.blaze3d.systems.RenderSystem#overlayBlendFunc- 设置具有透明度的层之间的默认覆盖混合函数。com.mojang.blaze3d.vertexPoseStack#translate(Vec3)- 使用向量平移顶部姿势VertexConsumer#setNormal(PoseStack$Pose, Vec3)- 使用向量设置顶点的法线
net.minecraftOptionull#orElse- 如果第一个对象为 null,则返回第二个对象。TracingExecutor- 一个跟踪正在执行的类引用的堆栈帧的执行器。UtilallOf- 对所有提供的谓词或谓词列表进行 AND 操作。如果没有提供谓词,该方法将默认为true。anyOf- 对所有提供的谓词或谓词列表进行 OR 操作。如果没有提供谓词,该方法将默认为false。makeEnumMap- 根据枚举类和一个将枚举转换为值的函数创建一个枚举映射。
net.minecraft.advancements.critereonInputPredicate- 一个匹配玩家正在进行的输入的谓词。SheepPredicate- 用于实体是绵羊时的谓词。
net.minecraft.clientMinecraftsaveReport- 将崩溃报告保存到给定文件。triggerResourcePackRecovery- 当发生编译异常时尝试保存游戏的函数,目前在加载着色器时使用。
Options#highContrastBlockOutline- 启用时,在悬停在范围内方块上时提供更高的对比度。ScrollWheelHandler- 一个用于在鼠标滚轮滚动时存储信息的处理器。
ItemSlotMouseAction- 一个接口,定义鼠标悬停在槽位上时如何与槽位交互。net.minecraft.client.gui.componentsAbstractSelectionList#setSelectedIndex- 根据索引设置选中的条目。AbstractWidget#playButtonClickSound- 播放按钮点击声音。DebugScreenOverlay#getProfilerPieChart- 获取饼图分析器渲染器。
net.minecraft.client.gui.components.debugchart.AbstractDebugChart#getFullHeight- 返回渲染图表的高度。net.minecraft.client.gui.components.toastsToastgetWantedVisbility- 返回要渲染的吐司的可见性。update- 更新吐司内的数据。
TutorialToast有一个接受int表示显示时间(以毫秒为单位)的构造函数。
net.minecraft.client.gui.font.glyphs.BakedGlyphrenderChar- 以指定颜色渲染一个字符。$GlyphInstance- 一个带有其屏幕位置元数据的字形实例。
net.minecraft.client.gui.screensBackupConfirmScreen有一个构造函数,接受另一个Component表示清除缓存的提示。ScreengetFont- 返回当前用于渲染屏幕的字体。showsActiveEffects- 当为 true 时,显示当前应用于玩家的状态效果,假设相关屏幕添加了该功能。
net.minecraft.client.gui.screens.inventoryAbstractContainerScreenBACKGROUND_TEXTURE_WIDTH、BACKGROUND_TEXTURE_HEIGHT- 都设置为 256。addItemSlotMouseAction- 当悬停在槽位上时添加鼠标动作。renderSlots- 渲染菜单内的所有活动槽位。
AbstractRecipeBookScreen- 一个屏幕,具有从构造函数提供的可渲染和可交互的RecipeBookComponent。
net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent#showTooltipWithItemInHand- 返回当物品在玩家手中时是否应渲染工具提示。net.minecraft.client.gui.screens.worldselectionCreateWorldCallback- 一个接口,在给定当前屏幕、注册表、等级数据和路径目录的情况下创建世界。CreateWorldScreen#testWorld- 尝试使用提供的生成设置上下文打开世界创建屏幕。InitialWorldCreationOptions- 包含创建要生成的世界时设置的选项。WorldCreationContextMapper- 一个接口,从可用的资源重载器和注册表创建世界上下文。
net.minecraft.client.multiplayerClientChunkCachegetLoadedEmptySections- 返回已由游戏加载但没有数据的部分。
ClientLevelisTickingEntity- 返回实体是否在等级中Tick。setSectionRangeDirty- 将一个区域标记为脏,以便在持久性和网络调用期间更新。onSectionBecomingNonEmpty- 当部分有数据时更新该部分。
PlayerInfo#setTabListOrder、getTabListOrder- 处理玩家标签页中循环切换玩家的顺序。
net.minecraft.client.multiplayer.chat.report.ReportReason#getIncompatibleCategories- 获取对于给定类型无法报告的所有原因。net.minecraft.client.particle.TrailParticle- 一个从其当前位置到目标位置的拖尾粒子。net.minecraft.client.player.LocalPlayer#getDropSpamThrottler- 返回一个节流器,确定玩家何时可以丢弃下一个物品。net.minecract.client.rendererCloudRenderer- 处理云纹理数据的渲染和加载。DimensionSpecialEffects#isSunriseOrSunset- 返回维度时间是否代表游戏中的日出或日落。LevelEventHandler- 处理由Level#levelEvent方法发送的事件。LevelRenderergetCapturedFrustrum- 返回渲染器的平截头体框。getCloudRenderer- 返回天空盒中云的渲染器。onSectionBecomingNonEmpty- 当部分有数据时更新该部分。
LevelTargetBundle- 保存渲染阶段的资源句柄和渲染目标。LightTexturegetBrightness- 返回给定环境光和天空光的亮度。lightCoordsWithEmission- 返回打包的光照坐标。
RenderTypeentitySolidZOffsetForward- 获取一个实体的固体渲染类型,其中 z 从单个渲染对象偏移。flatClouds- 获取平坦云的渲染类型。debugTriangleFan- 获取调试三角形的渲染类型。vignette- 获取晕影类型。crosshair- 获取玩家准星的渲染类型。mojangLogo- 获取 Mojang 徽标的渲染类型
Octree- 一个用于定义部分应在平截头体中渲染顺序的遍历实现。ShapeRenderer- 用于在 Minecraft 等级中渲染基本形状的工具。SkyRenderer- 渲染天空。WeatherEffectRenderer- 渲染天气效果。WorldBorderRenderer- 渲染世界边界。
net.minecraft.client.rendererSectionOcclusionGraph#getOctree- 返回用于处理渲染部分遍历的八叉树。ViewArea#getCameraSectionPos- 获取相机的部分位置。
net.minecraft.client.renderer.culling.FrustumgetFrustumPoints- 将平截头体矩阵作为Vector4f数组返回。getCamX、getCamY、getCamZ- 返回平截头体相机坐标。
net.minecraft.client.renderer.chunk.CompileTaskDynamicQueue- 一个处理块渲染部分编译任务的同步队列。net.minecraft.client.renderer.debugChunkCullingDebugRenderer- 用于当块被剔除时的调试渲染器。DebugRendererrenderAfterTranslucents- 在半透明渲染后渲染块剔除渲染器。renderVoxelShape- 渲染体素形状的轮廓。toggleRenderOctree- 切换是否渲染OctreeDebugRenderer。
OctreeDebugRenderer- 渲染部分节点的顺序。
net.minecraft.client.renderer.texture.AbstractTexture#defaultBlur、getDefaultBlur- 返回正在应用的模糊是否是默认模糊。net.minecraft.client.resources.DefaultPlayerSkin#getDefaultSkin- 返回默认的PlayerSkin。net.minecraft.commands.CommandBuildContext#enabledFeatures- 返回功能标志net.minecraft.commands.arguments.selector.SelectorPattern- 一个记录,定义从某种模式解析的EntitySelector。net.minecraft.coreBlockPos#betweenClosed- 返回边界框内所有位置的迭代器。DirectiongetYRot- 返回给定方向的 Y 旋转。getNearest- 给定某个 XYZ 坐标,返回最近的方向,如果没有更近的方向则返回后备方向。getUnitVec3- 返回法线单位向量。$Axis#getPositive、getNegative、getDirections- 获取沿轴的方向。
GlobalPos#isCloseEnough- 返回此位置到另一个维度中块位置的距离是否在给定半径内。HolderLookup$ProviderlistRegistries- 返回每个注册表的注册表查找。allRegistriesLifecycle- 返回所有注册表组合的生命周期。
HolderSet#isBound- 返回集合是否绑定到某个值。Registry$PendingTags#size- 获取要加载的标签数量。Vec3i#distChessboard- 获取向量分量之间的最大绝对距离。
net.minecraft.core.componentDataComponentHolder#getAllOfType- 返回属于特定类类型的所有数据组件。DataComponentPredicatesomeOf- 构造一个数据组件谓词,其中提供的映射包含提供的组件类型。$Builder#expect- 添加我们应该期望数据组件具有某个值。
PatchedDataComponentMap#clearPatch- 清除对象上数据组件的所有补丁。
net.minecraft.core.particles.TargetColorParticleOption- 一个指定粒子目标位置和颜色的粒子选项。net.minecraft.data.DataProvidersaveAll- 使用提供的编解码器将资源位置到值的映射中的所有值写入PathProvider。saveStable- 使用给定的编解码器将值写入提供的路径。
net.minecraft.data.loot#BlockLootSubProvidercreateMossyCarpetBlockDrops- 为苔藓地毯块创建一个战利品表。createShearsOrSlikTouchOnlyDrop- 创建一个只有在用剪刀或带有精准采集附魔的物品挖掘时才能掉落其物品的战利品表。
net.minecraft.data.worldgen.Pools#createKey- 为模板池创建一个ResourceKey。net.minecraft.data.models.EquipmentModelProvider- 装备模型的模型提供者,仅包含原版引导。net.minecraft.data.info.DatapackStructureReport- 一个返回数据包结构的提供者。net.minecraft.gametest.frameworkGameTestHelperabsoluteAABB、relativeAABB- 在绝对坐标和相对于测试位置的坐标之间移动边界框assertEntityData- 断言提供的块位置的实体匹配谓词。hurt- 从某个来源对实体造成指定数量的伤害。kill- 杀死实体。
GameTestInfo#getTestOrigin- 获取测试的生成结构的原点。StructureUtils#getStartCorner- 获取要运行的测试的起始位置。
net.minecraft.networkFriendlyByteBufreadVec3、writeVec3- 读取和写入向量的静态方法。readContainerId、writeContainerId- 读取和写入菜单标识符的方法。readChunkPos、writeChunkPos- 读取和写入区块位置的方法。
StreamCodec#composite- 一个接受七个/八个参数的组合方法。
net.minecraft.network.codec.ByteBufCodecsCONTAINER_ID- 处理菜单标识符的流编解码器。ROTATION_BYTE- 打包到字节中的旋转。LONG- 长整型(64 字节)的流编解码器。OPTIONAL_VAR_INT- 可选整数的流编解码器,当不存在时序列化0,否则序列化存储值加一。- 使用此流编解码器无法正确发送
-1。
- 使用此流编解码器无法正确发送
net.minecraft.network.protocol.gameClientboundEntityPositionSyncPacket- 一个同步实体位置的数据包。ClientboundPlayerRotationPacket- 一个包含玩家旋转的数据包。
net.minecraft.serverMinecraftServertickConnection- Tick连接以处理数据包。reportPacketHandlingException- 报告尝试处理数据包时抛出的异常pauseWhileEmptySeconds- 确定当没有玩家在线时服务器应暂停多少刻。
SuppressedExceptionCollector- 一个处理被服务器抑制的异常的处理器。
net.minecraft.server.commands.LookAt- 一个接口,定义当命令运行时实体应该发生什么,通常是移动它以看向另一个实体。net.minecraft.server.levelChunkHolder#hasChangesToBroadcast- 返回区块内是否有任何更新要发送给客户端。ChunkTaskDispatcher- 区块的任务调度器。DistanceManagergetSpawnCandidateChunks- 返回玩家可以生成的所有区块。getTickingChunks- 返回当前正在Tick的所有区块。
ServerChunkCache#onChunkReadyToSend- 将一个区块持有者添加到队列中进行广播。ServerEntityGetter- 一个在ServerLevel上操作的实体获取器接口实现。- 替换了
EntityGetter中缺失的方法
- 替换了
ServerPlayergetTabListOrder- 处理玩家标签页中循环切换玩家的顺序。getLastClientInput、setLastClientInput、getLastClientMoveIntent- 处理服务器玩家如何解释客户端脉冲。commandSource- 返回玩家的命令源。createCommandSourceStack- 创建发出命令的玩家的源堆栈。
ThrottlingChunkTaskDispatcher- 一个设置最大同时执行区块数的区块任务调度器。TickingTracker#getTickingChunks- 返回当前正在Tick的所有区块。
net.minecraft.server.packs.repository.PackRepository#isAbleToClearAnyPack- 重建选定的资源包并返回它是否与当前选定的资源包不同。net.minecraft.resources.DependantName- 一个将某个注册表对象ResourceKey映射到一个值的引用对象。类似于Holder,但作为一个函数式接口。net.minecraft.tags.TagKey#streamCodec- 为标签键构造一个流编解码器。net.minecraft.utilARGB#vector3fFromRGB24- 使用整数的低 24 位创建一个包含 RGB 分量的Vector3f。BinaryAnimator- 一个使用缓动函数在两个状态之间进行动画的基本动画器。ExtraCodecsNON_NEGATIVE_FLOAT- 一个验证值不能为负的浮点编解码器。RGB_COLOR_CODEC- 一个表示 RGB 颜色的整数、浮点数或三维向量浮点编解码器。nonEmptyMap- 一个验证映射不为空的映射编解码器。
MthwrapDegrees- 将度数设置为 (-180, 180] 范围内的值。lerp- 使用分量在两个向量之间进行线性插值。length- 获取空间中 2D 点的长度。easeInOutSine- 一个从 (0,0) 开始,每 pi 在 1 和 0 之间交替的余弦函数。packDegrees、unpackDegrees- 将float形式的度数存储到byte中并读取。
RandomSource#triangle- 使用三角形分布在两个float(包含,不包含)之间返回一个随机的float。StringRepresentable$EnumCodec#byName- 通过字符串名称获取枚举,如果为 null 则获取提供的供应商值。TriState- 一个表示三种可能状态的枚举:true、false 或 default。
net.minecraft.util.datafix.ExtraDataFixUtilspatchSubType- 将第一个类型中的第二个类型重写为第三个类型。blockState- 返回方块状态的动态实例fixStringField- 修改动态中的字符串字段。
net.minecraft.util.thread.BlockableEventLookupBLOCK_TIME_NANOS- 返回事件将阻塞线程的时间(以纳秒为单位)。isNonRecoverable- 返回异常是否可以恢复。
net.minecraft.world.damagesource.DamageSourcesenderPearl- 返回末影珍珠击中时的伤害来源。mace- 返回一个实体直接用狼牙棒击中另一个实体时的伤害来源。
net.minecraft.world.entityEntityapplyEffectsFromBlocks- 通过Block#entityInside或硬编码检查(如雪或雨)应用方块产生的任何效果。isAffectedByBlocks- 返回实体在内部时是否受方块影响。checkInsideBlocks- 获取玩家经过的所有方块,并检查实体是否在一个方块内,如果存在则将其添加到一个集合中。oldPosition、setOldPosAndrot、setOldPos、setOldRot- 更新实体最后位置和旋转的辅助方法。getXRot、getYRot- 返回给定部分刻下实体的线性插值旋转。isAlliedTo(Entity)- 返回实体是否与此实体结盟。teleportSetPosition- 通过DimensionTransition设置被传送实体的位置和旋转数据getLootTable- 返回实体应使用的战利品表的ResourceKey(如果存在)。isControlledByOrIsLocalPlayer- 返回实体是否是本地玩家或由本地玩家控制。shouldPlayLavaHurtSound- 当为true时,实体受到熔岩伤害时播放熔岩伤害声音。onRemoval- 当实体被移除时调用的方法。cancelLerp- 停止任何插值移动。forceSetRotation- 设置实体的旋转。isControlledByClient- 返回实体是否由客户端输入控制。
EntityTypegetDefaultLootTable现在返回一个Optional,以防战利品表不存在$Builder#noLootTable- 设置实体类型在死亡时不生成战利品。$Builder#build现在接受实体类型的资源键
EntitySelector#CAN_BE_PICKED- 返回一个选择器,获取所有不在旁观模式下的可拾取实体。LivingEntitydropFromShearingLootTable- 使用剪毛上下文解析战利品表。getItemHeldByArm- 返回特定手臂持有的堆栈。getEffectiveGravity- 返回应用于实体的重力。canContinueToGlide- 返回实体是否仍能在空中滑翔。getItemBlockingWith- 返回玩家当前正在格挡的堆栈。canPickUpLoot- 返回实体是否可以拾取物品。dropFromGiftLootTable- 使用礼物上下文解析战利品表。handleExtraItemsCreatedOnUse- 处理活体实体因使用另一个物品而获得新物品时的情况。isLookingAtMe- 检查提供的实体是否正在看着这个实体。
PositionMoveRotation- 用于处理上下文中实体的位置和旋转的辅助工具。WalkAnimationState#stop- 停止实体的行走动画。
net.minecraft.world.entity.ai.attributesAttributeInstancegetPermanentModifiers- 返回应用于实体的所有永久修饰符。addPermanentModifiers- 添加一组要应用的永久修饰符。
AttributeMap#assignPermanentModifiers- 从另一个映射复制永久修饰符。
net.minecraft.world.entity.ai.control.Control#rotateTowards- 返回一个浮点数,通过提供的差值在钳制值内旋转到某个最终旋转。net.minecraft.world.entity.ai.goal.Goal#getServerLevel- 根据实体或等级获取服务器等级。net.minecraft.world.entity.ai.navigation.PathNavigationupdatePathfinderMaxVisitedNodes- 更新实体可以访问的最大节点数。setRequiredPathLength- 设置实体必须采取的最小路径长度。getMaxPathLength- 返回实体可以采取的最大路径长度。
net.minecraft.world.entity.ai.sensingPlayerSensor#getFollowDistance- 返回此实体的跟随距离。Sensor#wasEntityAttackableLastNTicks- 返回一个谓词,检查实体在指定的刻数内是否可攻击。
net.minecraft.world.entity.ai.village.poi.PoiRecord#pack、PoiSection#pack- 打包必要的兴趣点信息。这只移除了脏 runnable。net.minecraft.world.entity.animalAgeableWaterCreature- 一个有年龄状态的水生生物。AnimalcreateAnimalAttributes- 为动物创建属性提供者。playEatingSound- 播放动物在进食时发出的声音。
Bee#isNightOrRaining- 返回当前等级是否有天空光,并且是夜晚或下雨。Cat#isLyingOnTopOfSleepingPlayer- 返回猫是否在睡觉的玩家身上。Salmon#getSalmonScale- 返回应用于实体边界框的缩放因子。Wolf#DEFAULT_TAIL_ANGLE- 返回狼的默认尾巴角度。
net.minecraft.world.entity.boss.enderdragon.DragonFlightHistory- 保存龙在天空飞行时的 Y 轴和旋转。用于更好地动画龙身体部位的运动。net.minecraft.world.entity.monster.Zombie#canSpawnInLiquids- 当为 true 时,僵尸可以在液体中生成。net.minecraft.world.entity.playerInventoryisUsableForCrafting- 返回状态是否可以用于合成配方。createInventoryUpdatePacket- 创建用于更新库存中物品的数据包。
PlayerhandleCreativeModeItemDrop- 处理玩家从创造模式丢弃物品时的情况。shouldRotateWithMinecart- 返回玩家是否也应随矿车旋转。canDropItems- 当为true时,玩家可以从菜单中丢弃物品。getPermissionLevel、hasPermissions- 返回玩家的权限。
StackedContents- 保存内容列表及其关联大小。$Output- 一个接口,定义在选择内容时如何接受它们。
net.minecraft.world.entity.projectile.ProjectilespawnProjectileFromRotation- 生成一个投射物并从给定的旋转角度射出。spawnProjectileUsingShoot- 生成一个投射物并通过#shoot设置初始冲量。spawnProjectile- 生成一个投射物。applyOnProjectileSpawned- 根据给定的等级和ItemStack应用任何额外的配置。onItemBreak- 处理发射投射物的物品损坏时的情况。shouldBounceOnWorldBorder- 返回投射物是否应弹离世界边界。setOwnerThroughUUID- 通过查询其 UUID 来设置投射物的拥有者。$ProjectileFactory- 定义投射物如何从某个ItemStack由实体生成。
net.minecraft.world.entity.vehicleAbstractBoat- 一个代表船的实体。AbstractChestBoat- 一个代表带有某种库存的船的实体。ChestRaft- 一个代表带有某种库存的木筏的实体。Raft- 一个代表木筏的实体。
net.minecraft.world.inventory.AbstractContainerMenuaddInventoryHotbarSlots- 在给定的 x 和 y 位置为给定容器添加快捷栏槽位。addInventoryExtendedSlots- 在给定的 x 和 y 位置为给定容器添加玩家库存槽位。addStandardInventorySlots- 在给定的 x 和 y 位置为给定容器在其正常位置添加快捷栏和玩家库存槽位。setSelectedBundleItemIndex- 切换槽位中选中的捆绑包。
net.minecraft.world.itemBundleItemgetOpenBundleModelFrontLocation、getOpenBundleModelBackLocation- 返回捆绑包的模型位置。toggleSelectedItem、hasSelectedItem、getSelectedItem、getSelectedItemStack- 处理捆绑包内的物品选择。getNumberOfItemsToShow- 确定一次显示的捆绑包中的物品数量。getByColor- 处理从捆绑包到染色捆绑包的可用链接。getAllBundleItemColors- 返回所有染色捆绑包的流。
ItemStackclearComponents- 清除对堆栈所做的补丁,而不是物品组件。isBroken- 返回堆栈是否已损坏。hurtWithoutBreaking- 损坏堆栈而不使其损坏。getStyledHoverName- 获取堆栈的样式化名称组件。
net.minecraft.world.item.component.BundleContentscanItemBeInBundle- 物品是否可以放入捆绑包。getNumberOfItemsToShow- 确定一次显示的捆绑包中的物品数量。hasSelectedItem、getSelectedItem- 处理捆绑包内的物品选择。
net.minecraft.world.item.enchantment.EnchantmentHelpercreateBook- 创建一个附魔书堆栈。doPostAttackEffectsWithItemSourceOnBreak- 在物品损坏时,在攻击后应用附魔。
net.minecraft.world.levelBlockCollisions有一个接受CollisionContext的构造函数BlockGetter#boxTraverseBlocks- 返回在给定边界框中沿向量遍历的位置的迭代器。CollisionGetternoCollision- 返回实体与方块、实体以及如果提供的boolean为true则液体之间是否存在碰撞。getBlockAndLiquidCollisions- 返回边界框内实体的方块和液体碰撞。clipIncludingBorder- 获取指定剪辑上下文的方块命中结果,必要时由世界边界钳制。
EmptyBlockAndTintGetter- 一个虚拟的BlockAndTintGetter实例。GameType#isValidId- 检查 id 是否与现有的游戏类型匹配。LevelHeightAccessor#isInsideBuildHeight- 返回指定的 Y 坐标是否在等级的边界内。
net.minecraft.world.level.blockBlock#UPDATE_SKIP_SHAPE_UPDATE_ON_WIRE- 一个方块标志,当启用时,不更新红石线的形状。BonemealableFeaturePlacerBlock- 一个放置配置功能并可以施骨粉的方块。
net.minecraft.world.level.block.entity.trialspawner.TrialSpawnerData#resetStatistics- 将生成的数据重置为空设置,但不清除当前生物或下一个生成实体。net.minecraft.world.level.block.piston.PistonMovingBlockEntity#getPushDirection- 返回移动活塞的推动方向。net.minecraft.world.level.block.stateBlockBehaviourgetEntityInsideCollisionShape、$BlockStateBase#getEntityInsideCollisionShape- 确定实体在内部时方块的体素形状。$Properties#overrideDescription- 设置方块名称的翻译键。
StateHoldergetValueOrElse- 返回属性的值,否则返回提供的默认值。getNullableValue- 返回属性的值,如果不存在则返回 null。
net.minecraft.world.level.block.state.properties.Property#getInternalIndex- 当为 true 时将提供的布尔值转换为 0,否则转换为 1。net.minecraft.world.level.border.WorldBorder#clampVec3ToBound- 将向量钳制在世界边界内。net.minecraft.world.level.chunkChunkAccess#canBeSerialized- 返回 true,允许将区块写入磁盘。ChunkSource#onSectionEmptinessChanged- 当部分有数据时更新该部分。LevelChunkSectioncopy- 制作区块部分的浅拷贝。setUnsavedListener- 添加一个监听器,每当区块被标记为脏时,该监听器接受区块位置。$UnsavedListener- 一个当区块被标记为脏时被调用的区块位置消费者。
PalettedContainerRO#copy- 创建PalettedContainer的浅拷贝。UpgradeData#copy- 创建UpgradeData的深拷贝。
net.minecraft.world.level.chunk.storage.IOWorker#store- 将区块的写入存储到工作器中。net.minecraft.world.level.levelgenSurfaceRules$Context#getSeaLevel、SurfaceSystem#getSeaLevel- 获取生成器设置的海平面。WorldOptions#testWorldWithRandomSeed- 使用随机生成的种子创建一个测试世界。
net.minecraft.world.level.levelgen.feature.treedecorators.TreeDecorator$Context#checkBlock- 检查给定位置的方块是否匹配谓词。net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplategetJigsaws- 返回在给定位置和旋转下具有给定旋转的拼图方块。getJointType- 返回拼图方块的连接类型。$JigsawBlockInfo- 一个包含拼图方块块信息的记录。- 大多数涉及拼图的方法已将
$StructureBlockInfo替换为$JigsawBlockInfo。
- 大多数涉及拼图的方法已将
net.minecraft.world.level.lighting.LayerLightSectionStorage#lightOnInColumn- 返回零节点部分位置是否有光。net.minecraft.world.level.pathfinder.PathFinder#setMaxVisitedNodes- 设置可以访问的最大节点数。net.minecraft.world.level.portalDimensionTransition#withRotation- 更新实体的生成旋转。PortalShape#findAnyShape- 找到一个可以位于给定方块位置并面向特定方向的PortalShape。
net.minecraft.world.physAABBclip- 在给定边界框内剪辑向量,如果没有交点则返回空 optional。collidedAlongVector- 返回此框是否与列表中提供的边界框之一沿提供的移动向量发生碰撞。getBottomCenter- 获取边界框底部中心的向量。
Vec3add、subtract- 平移向量并返回一个新对象。horizontal- 返回向量的水平分量。projectedOn- 获取表示此向量投影到另一个向量上的单位向量。
net.minecraft.world.phys.shapesCollisionContextof(Entity, boolean)- 创建一个新的实体碰撞上下文,其中boolean确定实体是否总是可以站在提供的流体状态上。getCollisionShape- 返回碰撞到的碰撞形状。
VoxelShape#move(Vec3)- 将体素形状按提供的向量偏移。
net.minecraft.world.ticks.ScheduledTick#toSavedTick- 将计划Tick转换为保存的Tick。
变更列表
F3 + F现在切换雾渲染com.mojang.blaze3d.platformNativeImagegetPixelRGBA、setPixelRGBA现在是私有的。它们分别被getPixel和setPixel取代getPixelsRGBA->getPixels
Window#updateDisplay现在接受一个TraceyFrrameCapture,或null
net.minecraft.UtilbackgroundExecutor、ioPool和nonCriticalIoPool现在返回TracingExecutor而不是ExecutorServicewrapThreadWithTaskName->runNamed,参数翻转,无返回值
net.minecraft.advancements.critereonKilledByCrossbowTrigger->KilledByArrowTrigger,不是一对一,接受相关的堆栈PlayerPredicate现在可以匹配玩家的输入
net.minecraft.clientMinecraftdebugFpsMeterKeyPress->ProfilerPieChart#profilerPieChartKeyPress,通过Minecraft#getDebugOverlay然后DebugScreenOverlay#getProfilerPieChart获得getTimer->getDeltaTrackergetToasts->getToastManager
Options#setModelPart现在是公开的,取代了toggleModelPart但不广播更改ParticleStatus->net.minecraft.server.level.ParticleStatus
net.minecraft.client.animation.KeyframeAnimations#animate现在接受一个Model而不是HierarchicalModelnet.minecraft.client.gui.FontdrawInBatch(String, float, float, int, boolean, Matrix4f, MultiBufferSource, Font.DisplayMode, int, int, boolean)已移除,应使用Component替代- 还有一个委托,在
Component的drawInBatch方法中默认将逆深度布尔值设置为 true
- 还有一个委托,在
$StringRenderOutput现在接受Font、一个可选背景颜色,以及一个布尔值,表示在绘制文本时是否应使用逆深度$StringRenderOutput#finish现在是包私有的
net.minecraft.client.gui.componentsAbstractSelectionListreplaceEntries现在是公开的getRowTop、getRowBottom现在是公开的
PlayerFaceRenderer#draw(GuiGraphics, ResourceLocation, int, int, int, int)接受一个PlayerSkin而不是ResourceLocation
net.minecraft.client.gui.components.toastsToastToast$Visibility render(GuiGraphics, ToastComponent, long)->void render(GuiGraphics, Font, long)slotCount-occupiedSlotCount
ToastComponent->ToastManager
net.minecraft.client.gui.font.glyphs.BakedGlyphrender现在接受一个表示颜色的整数而不是四个浮点数,并且是私有的renderChar是公共替代,接受$GlyphInstance、Matrix4f、VertexConsumer和颜色整数
$Effect是一个记录,现在接受一个表示颜色的整数而不是四个浮点数
net.minecraft.client.gui.screensLoadingOverlay#MOJANG_STUDIOS_LOGO_LOCATION现在是公开的ScreenrenderBlurredBackground(float)->renderBlurredBackground()wrapScreenError->fillCrashDetails,不是一对一,因为它只添加相关的崩溃信息,而不是实际抛出错误
net.minecraft.client.gui.screens.inventoryAbstractContainerScreen#renderSlotHighlight->renderSlotHighlightBack、renderSlotHighlightFront,现在是私有的BookEditScreen现在接受WritableBookContentAbstractSignEditScreensign现在是 protectedrenderSignBackground不再接受BlockState
EffectRenderingInventoryScreen->Screen#hasActiveEffects、EffectsInInventory。不是一对一,因为EffectsInInventory现在作为一个辅助类,帮助屏幕在指定位置渲染其效果。
net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponentgetHeight()->getHeight(Font)renderImage现在接受渲染工具提示的int宽度和高度
net.minecraft.client.gui.screens.recipebookGhostSlots#render不再接受 x 和 y 偏移。RecipeBookComponent不再接受 x 和 y 偏移。
net.minecraft.client.gui.screens.reporting.ReportReasonSelectionScreen现在接受一个ReportTypenet.minecraft.client.gui.screens.worldselectionCreateWorldScreen$DataPackReloadCookie->DataPackReloadCookieopenFresh现在有一个接受CreateWorldCallback的重载
WorldCreationContext现在接受InitialWorldCreationOptionsWorldOpenFlows#createFreshLevel接受一个Function<HolderLookup.Provider, WorldDimensions>而不是Function<RegistryAccess, WorldDimensions>
net.minecraft.client.gui.spectator.SpectatorMenuItem#renderIcon现在接受一个float而不是int来表示 alpha 值net.minecraft.client.multiplayerClientLevel现在接受一个int表示海平面getSkyColor现在返回一个int而不是Vec3getCloudColor现在返回一个int而不是Vec3setGameTime、setDayTime->setTimeFromServer
TagCollector->RegistryDataCollector$TagCollector,现在是包私有的
net.minecraft.client.playerAbstractClientPlayer#getFieldOfViewModifier现在接受一个布尔值表示相机是否在第一人称,以及一个浮点数表示部分刻Input->ClientInput和net.minecraft.world.entity.player.InputKeyboardInput现在继承ClientInputLocalPlayer#input现在是ClientInput
net.minecraft.client.rendererDimensionSpecialEffects#getSunriseColor->getSunriseOrSunsetColorGameRendererprocessBlurEffect不再接受部分刻floatgetFov返回float而不是doublegetProjectionMatrix现在接受float而不是double
ItemModelShapershapes现在是私有的getItemModel(Item)已移除getItemModel(ResourceLocation)- 获取与提供的ResourceLocation关联的烘焙模型。register已移除getModelManager已移除invalidateCache- 清除模型映射。
LevelRendererrenderSnowAndRain->WeatherEffectRenderertickRain->tickParticlesrenderLevel现在接受一个GraphicsResourceAllocatorrenderClouds->CloudRendereraddParticle现在是公开的globalLevelEvent->LevelEventHandlerentityTarget->entityOutlineTarget$TransparencyShaderException不再接受可抛出原因
SectionOcclusionGraphonSectionCompiled->schedulePropagationFromupdate现在接受一个保存当前加载的部分节点的LongOpenHashSet$GraphState现在是包私有的addSectionsInFrustum现在接受一个列表以添加渲染部分
ShapeRenderer#renderShape现在接受一个整数表示颜色,而不是四个浮点数ViewArearepositionCamera现在接受SectionPos而不是两个doublegetRenderSectionAt->getRenderSection
net.minecraft.client.renderer.blockentityBannerRenderer#renderPatterns现在接受一个boolean确定要使用的闪光渲染类型- 构造
LayerDefinition的*Renderer类现在已移动到它们关联的*Model类 SignRenderer$SignModel->SignModel
net.minecraft.client.renderer.chunk.SectionRenderDispatcher现在接受一个TracingExecutor而不是仅仅一个Executor$CompiledSection#hasNoRenderableLayers->hasRenderableLayers$RenderSection现在接受一个编译的long表示部分节点setOrigin->setSectionNodegetRelativeOrigin->getNeighborSectionNodecancelTasks现在不返回任何内容pointOfView- 一个指向半透明渲染类型渲染位置的引用。resortTransparency不再接受RenderType并且不返回任何内容hasTranslucentGeometry- 返回编译的方块是否具有半透明渲染类型。transparencyResortingScheduled- 返回最后一个任务是否已调度但未完成。isAxisAlignedWith->$TranslucencyPointOfView#isAxisAligned
$CompileTask现在是公开的- 不再实现
Comparable - 构造函数不再接受创建时的距离
isHighPriority->isRecompile
- 不再实现
$TranslucencyPointOfView- 返回表示此部分中半透明渲染类型视图点的坐标。
net.minecraft.client.renderer.culling.Frustum#cubeInFrustum现在返回一个int,表示剔除该框的第一个平面的索引net.minecraft.client.renderer.DebugRenderer#render现在接受Frustumnet.minecraft.client.renderer.texture.atlas.sources.PalettedPermutations#loadPaletteEntryFromImage现在是私有的net.minecraft.client.tutorialTutorialaddTimedToast、#removeTimedToast、$TimedToast->TutorialToast参数onInput接受一个ClientInput而不是Input
TutorialStepInstanceonInput接受一个ClientInput而不是Input
net.minecraft.coreDirectiongetNearest->getApproximateNearestgetNormal->getUnitVec3i
HolderGetter$Provider#get不再接受注册表键,而是从ResourceKey读取它HolderLookup$Provider现在实现HolderGetter$ProviderasGetterLookup已移除,因为该接口是一个HolderGetter$ProviderlistRegistries->listRegistryKeys
Registry现在实现HolderLookup$RegistryLookupgetTags只返回命名持有者集的流asTagAddingLookup->prepareTagReloadbindTags->WritabelRegistry#bindTagget->getValuegetOrThrow->getValueOrThrowgetHolder->getgetHolderOrThrow->getOrThrowholders->listElementsgetTag->getholderOwner、asLookup已移除,因为Registry是它们的实例
RegistryAccessregistry->lookupregistryOrThrow->lookupOrThrow
RegistrySynchronization#NETWORKABLE_REGISTRIES->isNetworkable
net.minecraft.core.cauldron.CauldronInteractionFILL_WATER->fillWaterInteraction,现在是私有的FILL_LAVA->fillLavaInteraction,现在是私有的FILL_POWDER_SNOW->fillPowderSnowInteraction,现在是私有的SHULKER_BOX->shulkerBoxInteraction,现在是私有的BANNER->bannerInteraction,现在是私有的DYED_ITEM->dyedItemIteration,现在是私有的
net.minecraft.core.dispenser.BoatDispenseItemBehavior现在接受要生成的EntityType而不是变体和是否有箱子的布尔值net.minecraft.core.particles.DustColorTransitionOptions、DustParticleOptions现在接受表示 RGB 值的整数而不是Vector3f。net.minecraft.data.lootBlockLootSubProviderHAS_SHEARS->hasShearscreateShearsOnlyDrop现在是一个实例方法
EntityLootSubProviderkilledByFrog、killedByFrogVariant现在接受EntityType注册表的获取器createSheepTable->createSheepDispatchPool,不是一对一,因为该表被替换为一个池构建器,给定一个染料颜色到战利品表的映射
net.minecraft.gametest.frameworkGameTestHelper#assertEntityPresent、assertEntityNotPresent接受一个边界框而不是两个向量GameTestInfo#getOrCalculateNorthwestCorner现在是公开的
net.minecraft.network.chat.Component#score现在接受一个SelectorPatternnet.minecraft.network.chat.contents.ScoreContents、SelectorContents现在是一个记录net.minecraft.network.protocol.login.ClientboundGameProfilePacket->ClientboundLoginFinishedPacketnet.minecraft.network.protocol.gameClientboundMoveEntityPacket#getyRot、getxRot现在返回一个float表示度数ClientboundPlayerPositionPacket现在是一个记录,接受一个表示变化的PositionMoverotationrelativeArguments->relativesyRot、xRot->ClientboundPalyerRotationPacket
ClientboundSetTimePacket现在是一个记录ClientboundRotateHeadPacket#getYHeadRot现在返回一个float表示度数ClientboundTeleportEntityPacket现在是一个记录,其中必要的参数被传入数据包而不是实体ServerboundPlayerInputPacket现在是一个记录,接受一个Input
net.minecraft.resources.RegistryDataLoader$Loader#loadFromNetwork现在接受一个$NetworkedRegistryData,其中包含打包的注册表条目net.minecraft.serverMinecraftServer不再实现AutoCloseabletickChildren现在是 protectedwrapRunnable现在是公开的
ReloadableServerRegistries#reload现在接受一个待处理标签的列表,并返回一个$LoadResult而不是一个分层注册表访问ReloadableServerResourcesloadResources现在接受一个待处理标签的列表和服务器ExecutorupdateRegistryTags->updateStaticRegistryTags
ServerFunctionLibrary#getTag、ServerFunctionManager#getTag返回一个命令函数列表
net.minecraft.server.levelChunkHolderblockChanged、sectionLightChanged现在返回boolean表示信息是否已更改addSaveDependency现在是 protected,GenerationChunkHolder中的一个方法
ChunkTaskPriorityQueue不再接受泛型- 构造函数不再接受最大任务数
submit现在接受一个Runnable而不是Optionalpop返回一个$TasksForChunk而不是原始的Stream
ChunkTaskPriorityQueueSorter->ChunkTaskDispatcherServerPlayerteleportTo接受一个boolean,决定是否应设置相机INTERACTION_DISTANCE_VERIFICATION_BUFFER->BLOCK_INTERACTION_DISTANCE_VERIFICATION_BUFFER- 还拆分为
ENTITY_INTERACTION_DISTANCE_VERIFICATION_BUFFER,设置为 3.0
- 还拆分为
findRespawnPositionAndUseSpawnBlock现在处理TeleportTransition
TextFilterClient->ServerTextFilterThreadedLevelLightEngine现在接受一个ConsecutiveExecutor和ChunkTaskDispatcher而不是分别接受ProcessorMailbox和ProcessorHandle
net.minecraft.server.packs.resources.ProfiledReloadInstance$State现在是一个记录net.minecraft.sounds.SoundEvent现在是一个记录net.minecraft.tagsTagEntry$Lookup#element现在接受一个boolean表示元素是否必需TagLoader现在接受一个$ElementLookup,其功能与之前的函数参数相同build现在返回一个列表的值loadAndBuild->loadTagsFromNetwork、loadTagsForExistingRegistries、loadTagsForRegistry、buildUpdatedLookups
TagNetworkSerialization$NetworkPayloadsize->isEmptyapplyToRegistry->resolve
net.minecraft.utilFastColor->ARGBscaleRGB重载,带有一个 alpha 整数和三个浮点数。
Mth#color->ARGB#color
net.minecraft.util.profiling.metrics.MetricCategory#MAIL_BOXES->CONSECUTIVE_EXECUTORSnet.minecraft.util.threadBlockableEventLoop#waitForTasks现在是 protectedProcessorMailbox不再实现AutoCloseable
net.minecraft.util.worldupdate.WorldUpgrader实现AutoCloseablenet.minecraft.world.LockCode现在接受一个ItemPredicate而不是表示物品名称的StringaddToTag、fromTag现在接受一个HolderLookup$Provider
net.minecraft.world.effectMobEffect#applyEffectTick、applyInstantenousEffect、onMobRemoved、onMobHurt现在接受ServerLevelMobEffectInstance#onMobRemoved、onMobHurt现在接受ServerLevel
net.minecraft.world.entityAgeableMob$AgeableMobGroupData现在有一个公共构造函数AnimationState#getAccumulatedTime->getTimeInMillisEntity不再实现CommandSourcesetOnGroundWithMovement现在接受一个额外的boolean表示是否有任何水平碰撞。getInputVector现在是 protectedisAlliedTo(Entity)->considersEntityAsAllyteleportTo现在接受一个额外的boolean,决定是否应设置相机checkInsideBlocks()->recordMovementThroughBlocks,不是一对一,因为它接受移动向量checkInsideBlocks(Set<BlockState>)->collectBlockCollidedWith,现在是私有的kill现在接受ServerLevelhurt已被标记为已弃用,将被hurtServer和hurtClient取代hurtOrSimulate作为一个辅助方法,决定调用哪一个,也被标记为已弃用
spawnAtLocation现在接受ServerLevelisInvulnerableTo->isInvulnerableToBase,现在是 protected 和 finalisInvulnerableTo已移至LivingEntity#isInvulnerableTo
teleportSetPosition现在是公开的,接受PositionMoveRotation和Relative集而不是DimensionTransitioncreateCommandSourceStack->createCommandSourceStackForNameResolution,不是一对一,因为它接受ServerLevelmayInteract现在接受ServerLevel而不是仅仅LevelsetOldRot现在是公开的changeDimension->teleport,给定TeleportTransition返回ServerPlayercanChangeDimensions->canTeleport
EntitySpawnReason#SPAWN_EGG->SPAWN_ITEM_USE,不是一对一,因为这表示实体可以从任何物品生成EntityTypecreate、loadEntityRecursive、loadEntitiesRecursive、loadStaticEntity现在接受一个EntitySpawnReason*StackConfig现在接受一个Level而不是ServerLevel
EquipmentTable现在有一个构造函数,接受一个单一的float表示所有装备槽位的槽位掉落几率MobSpawnType->EntitySpawnReasonLeashable#tickLeash现在接受ServerLevelLivingEntitygetScale现在是 finalonAttributeUpdated现在是 protectedactiveLocationDependentEnchantments现在接受一个EquipmentSlothandleRelativeFrictionAndCalculateMovement现在是私有的updateFallFlying现在是 protectedonEffectRemoved->onEffectsRemovedspawnItemParticles现在是公开的getLootTable->Entity#getLootTable,包装在 optional 中getBaseExperienceReward现在接受ServerLeveltriggerOnDeathMobEffects现在接受ServerLevelcanAttack已移除dropEquipment现在接受ServerLeveldropExperience现在接受ServerLeveldropFromLootTable现在接受ServerLevelactuallyHurt、doHurtTarget现在接受ServerLevelhasLineOfSight重载,带有剪辑上下文和眼睛 Y 提供者makePoofParticles现在是公开的
MobpickUpItem、wantsToPickUp现在接受ServerLevelequipItemIfPossible现在接受ServerLevelcustomServerAiStep现在接受ServerLeveldropPreservedEquipment现在接受ServerLevel
NeutralMobisAngryAt、isAngryAtAllPlayers现在接受ServerLevelplayerDied现在接受ServerLevel
PortalProcessor#getPortalDestination现在返回一个TeleportTransitionPositionMoveRotationof(ClientboundPlayerPositionPacket)->ofEntityUsingLerpTarget(Entity)of(DimensionTransition)->of(TeleportTransition)
Shearable#shear现在接受ServerLevel和正在剪毛的ItemStackRelativeMovement->Relative,扩展为包含增量移动WalkAnimationState#update现在接受一个额外的float表示移动时的位置缩放。
net.minecraft.world.entity.ai.behaviorStartAttacking现在接受一个$TargetFinder和一个$StartAttackingCondition- 两者都是函数式接口,取代了之前的函数/谓词,但多了一个
ServerLevel参数
- 两者都是函数式接口,取代了之前的函数/谓词,但多了一个
StopAttackingIfTargetInvalid现在接受一个$TargetErasedCallback和/或一个$StopAttackCondition- 两者都是函数式接口,取代了之前的消费者/谓词,但多了一个
ServerLevel参数
- 两者都是函数式接口,取代了之前的消费者/谓词,但多了一个
MeleeAttack#create现在可以接受一个谓词来测试生物Swim现在接受一个代表生物的泛型
net.minecraft.world.entity.ai.control.LookControl#rotateTowards->Control#rotateTowardsnet.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal现在接受一个$Selector- 这是一个函数式接口,取代了之前的谓词,但多了一个
ServerLevel参数
- 这是一个函数式接口,取代了之前的谓词,但多了一个
net.minecraft.world.entity.ai.memory.NearestVisibleLivingEntities现在接受一个ServerLevelnet.minecraft.world.entity.ai.sensingNearestLivingEntitySensorradiusXZ、radiusY->Attributes#FOLLOW_RANGEisMatchingEntity现在接受一个ServerLevel
SensorTARGETING_RANGE现在是私有的isEntityTargetable、isEntityAttackable、isEntityAttackableIgnoringLineOfSight现在接受一个ServerLevelwasEntityAttackableLastNTicks、rememberPositives现在处理BiPredicate而不是Predicate
net.minecraft.world.entity.ai.targeting.TargetingConditionsselector现在接受一个$Selector- 这是一个函数式接口,取代了之前的谓词,但多了一个
ServerLevel参数
- 这是一个函数式接口,取代了之前的谓词,但多了一个
test现在接受一个ServerLevel
net.minecraft.world.entity.ai.village.poi.PoiRecord#codec、PoiSection#codec->$Packed#CODECnet.minecraft.world.entity.animalFox$Type->$VariantMushroomCow$MushroomType->$Variant$Variant不再接受战利品表
Salmon现在有一个表示其大小的变体WolfgetBodyRollAngle->#getShakeAnim,不是一对一,因为角度是在渲染状态下计算的hasArmor已移除
net.minecraft.world.entity.animal.horse.AbstractHorse#followMommy现在接受一个ServerLevelnet.minecraft.world.entity.boss.enderdragon.EnderDragon#onCrystalDestroyed现在接受一个ServerLevelnet.minecraft.world.entity.boss.enderdragon.phases.DragonPhaseInstance#doServerTick现在接受一个ServerLevelnet.minecraft.world.entity.boss.wither.WitherBoss#getHead*Rot->getHead*Rots,返回所有旋转而不是仅返回提供的索引net.minecraft.world.entity.decorationArmorStand默认旋转现在是公开的isShowArms->showArmsisNoBasePlate->showBasePlate
PaintingVariant现在接受一个标题和作者Component
net.minecraft.world.entity.item.ItemEntity#getSpin现在是静态的net.minecraft.world.entity.monster.Monster#isPreventingPlayerRest现在接受一个ServerLevelnet.minecraft.world.entity.monster.breeze.Breeze#getSnoutYPosition->getFiringYPositionnet.minecraft.world.entity.monster.hoglin.HoglinBase#hurtAndThrowTarget现在接受一个ServerLevelnet.minecraft.world.entity.monster.piglin.PiglinAi#isWearingGold->#isWearingSafeArmornet.minecraft.world.entity.npc.InventoryCarrier#pickUpItem现在接受一个ServerLevelnet.minecraft.world.entity.playerPlayer#disableShield现在接受要应用冷却时间的堆栈InventoryfindSlotMatchingUnusedItem->findSlotMatchingCraftingIngredientswapPaint->setSelectedHotbarSlotStackedContents->StackedItemContents
net.minecraft.world.entity.projectileAbstractArrow#inGround->IN_GROUND,现在是一个EntityDataAccessor- 可通过
isInGround和setInGround受保护访问
- 可通过
ThrowableItemProjectile现在可以接受一个被投掷物品的ItemStack
net.minecraft.world.entity.raid.Raid#getLeaderBannerInstance->getOminousBannerInstancenet.minecraft.world.entity.vehicleBoat$Type现在接受提供的船物品和物品的翻译键,但不再接受它们由什么木板制成ContainerEntity*LootTable*->ContainerLootTablechestVehicleDestroyed现在接受一个ServerLevel
VehicleEntitydestroy现在接受一个ServerLevelgetDropItem现在是 protected
net.minecraft.world.itemBoatItem现在接受一个EntityType而不是变体和是否有箱子的布尔值ItemStack#hurtEnemy、postHurtEnemy现在接受一个LivingEntity而不是PlayerSmithingTemplateItem现在接受Item.Properties而不是硬编码,对于静态初始化器也是如此UseAnim->ItemUseAnimation
net.minecraft.world.item.crafting.ShulkerBoxColoring->TransmuteRecipe,扩展为将存储在物品上的任何数据复制到结果物品net.minecraft.world.item.enchantment.EnchantmentHelperonProjectileSpawned现在接受一个Projectile而不是AbstractArrow
net.minecraft.world.item.enchantment.effects.DamageItem->ChangeItemDamagenet.minecraft.world.levelGameRules在任何类型的构造期间都接受一个FeatureFlagSet$IntegerValue#create接受一个FeatureFlagSet$Type接受一个FeatureFlagSet
LevelsetSpawnSettings不再接受一个boolean来决定是否生成友好生物getGameRules->ServerLevel#getGameRules
LevelAccessor现在实现ScheduledTickAccess,一个现在包含原本在LevelAccessor上的Tick调度方法的接口neighborShapeChanged交换了BlockState和邻居BlockPos参数的顺序
LevelHeightAccessorgetMinBuildHeight->getMinYgetMaxBuildHeight->getMaxY,该值比之前版本少一getMinSection->getMinSectionYgetMaxSection->getMaxSectionY,该值比之前版本少一
NaturalSpawner#spawnForChunk已被拆分为两个方法:getFilteredSpawningCategories和spawnForChunk
net.minecraft.world.level.biome#Biome#getPrecipitationAt、coldEnoughToSnow、warmEnoughToRain、shouldMeltFrozenOceanIcebergSlightly现在接受一个int表示生物群系的基础高度net.minecraft.world.level.blockBlockshouldRenderFace接受正在检查的面的相对状态,不再传入BlockGetter或BlockPos。updateEntityAfterFallOn->updateEntityMovementAfterFallOn$BlockStatePairKey->FlowingFluid$BlockStatePairKey,现在是包私有的getDescriptionId->BlockBehaviour#getDescriptionId,也是一个 protected 字段descriptionId
ChestBlock构造函数交换了参数顺序Portal#getPortalDestination现在返回TeleportTransition
net.minecraft.world.level.block.entityAbstractFurnaceBlockEntity#serverTick现在接受一个ServerLevel而不是LevelBrushableBlockEntitybrush现在接受等级和执行刷洗行为的堆栈unpackLootTable现在是私有的checkReset现在接受服务器等级
net.minecraft.world.level.block.stateBlockBehaviourgetOcclusionShape、getLightBlock、propagatesSkylightDown只接受BlockState,不接受BlockGetter或BlockPosgetLootTable现在返回一个Optional,也是一个 protected 字段drops$BlockStateBase#getOcclusionShape、getLightBlock、getFaceOcclusionShape、propagatesSkylightDown、isSolidRender不再接受BlockGetter或BlockPos$BlockStateBase#getOffset不再接受BlockGetter$OffsetFunction#evaluate不再接受BlockGetter$Properties#dropsLike->overrideLootTable
StateHolder#findNextInCollection现在接受一个List而不是Collection
net.minecraft.world.level.chunkChunkAccessaddPackedPostProcess现在接受一个ShortList而不是一个shortgetTicksForSerialization现在接受一个long表示游戏时间unsaved现在是私有的setUnsaved->markUnsaved、tryMarkSaved$TicksToSave->$PackedTicks
ChunkSource#setSpawnSettings不再接受一个boolean来决定是否生成友好生物LevelChunk#postProcessGeneration现在接受一个ServerLevelPalette#copy现在接受一个PaletteResize
net.minecraft.world.level.chunk.status.WorldGenContext现在接受一个Executor或主线程,而不是一个处理器句柄邮箱- 构造函数还接受一个
LevelChunk$UnsavedListener,用于当区块被标记为脏时
- 构造函数还接受一个
net.minecraft.world.level.chunk.storageChunkSerializer->SerializableChunkDataChunkStorage#write现在接受一个提供的CompoundTag而不是实例本身SectionStorage现在接受第二个泛型,表示存储数据的打包形式- 构造函数现在接受打包编解码器、一个将存储转换为打包格式的函数,以及一个将打包数据和脏 runnable 转换回存储的函数。
net.minecraft.world.level.levelgenAquifer$FluidStatus现在是一个记录WorldDimensions#withOverworld现在接受一个HolderLookup而不是Registry本身BlendingData现在有一个打包和解包状态,用于将内部数据序列化为一个简单对象
net.minecraft.world.level.levelgen.material.MaterialRuleList现在接受一个数组而不是一个列表net.minecraft.world.level.levelgen.placement.PlacementContext#getMinBuildHeight->getMinYnet.minecraft.world.level.levelgen.structure.pools.StructurePoolElement#getShuffledJigsawBlocks现在返回StructureTemplate$JigsawBlockInfonet.minecraft.world.level.lightingLevelLightEngine#lightOnInSection->lightOnInColumnLightEnginehasDifferentLightProperties、getOcclusionShape不再接受BlockGetter或BlockPosgetOpacity不再接受BlockPosshapeOccludes不再接受两个long表示打包的位置
net.minecraft.world.level.materialFlowingFluidspread现在接受当前位置的BlockStategetSlopeDistance之前的参数已被合并到一个$SpreadContext对象中spread、getNewLiquid、canConvertToSource、getSpread现在接受一个ServerLevel
Fluidtick现在接受当前位置的BlockStatetick和randomTick现在接受ServerLevel
FluidStatetick现在接受当前位置的BlockStatetick和randomTick现在接受ServerLevel
MapColor#calculateRGBColor->calculateARGBColor
net.minecraft.world.level.portalDimensionTransition->TeleportTransitionpos->positionspeed->deltaMovement- 构造函数现在可以接受一组
Relatives来指示位置应相对于另一个位置移动的哪些运动
PortalShape#createPortalBlocks现在接受一个LevelAccessor
net.minecraft.world.level.saveddata.SavedData#save(File, HolderLookup$Provider)现在返回CompoundTag,不在方法中将数据写入文件net.minecraft.world.level.storageDimensionDataStorage现在实现AutoCloseable- 构造函数接受一个
Path而不是File save->scheduleSave和saveAndJoin
- 构造函数接受一个
LevelData#getGameRules->ServerLevelData#getGameRules
net.minecraft.world.phys.BlockHitResult现在接受一个布尔值表示是否击中了世界边界- 添加了两个辅助方法
hitBorder、isWorldBorderHit
- 添加了两个辅助方法
net.minecraft.world.ticksProtoChunkTicks#load现在接受一个保存的Tick列表SavedTick#loadTickList现在返回一个保存的Tick列表,而不是消费它们SerializableTickContainer#save->pack
移除列表
com.mojang.blaze3d.Blaze3Dprocessrender
com.mojang.blaze3d.pipeline.RenderPipeline- 被
com.mojang.blaze3d.framegraph.*和com.mojang.blaze3d.resources.*取代
- 被
com.mojang.blaze3d.platform.NativeImagesetPixelLuminancegetRedOrLuminance、getGreenOrLuminance、getBlueOrLuminanceblendPixelasByteArray
com.mojang.blaze3d.systems.RenderSystemglGenBuffersglGenVertexArrays_setShaderTextureapplyModelViewMatrix
net.minecraft.Util#wrapThreadWithTaskName(String, Supplier)net.minecraft.advancements.critereon.EntitySubPredicates#BOATnet.minecraft.client.Options#setKeynet.minecraft.client.gui.screens.inventory.EnchantmentScreen#timenet.minecraft.client.multiplayerClientCommonPacketListenerImpl#strictErrorHandlingClientLevel#isLightUpdateQueueEmptyCommonListenerCookie#strictErrorHandling
net.minecraft.client.particle.ParticleRenderType#PARTICLE_SHEET_LITnet.minecraft.client.rendererGameRenderer#resetProjectionMatrixLevelRendererplayJukeboxSongclear
PostChaingetTempTarget、addTempTarget
PostPasssetOrthoMatrixgetFilterMode
net.minecraft.client.renderer.block.model.BlockModel#fromStringnet.minecraft.client.renderer.textureAbstractTexture#blur、mipmapTextureManager#bindForSetup
net.minecraft.commands.arguments.coordinates.WorldCoordinates#currentnet.minecraft.coreDirection#fromDeltaRegistry#getOrCreateTag、getTagNames、resetTags
net.minecraft.server.MinecraftServerisSpawningAnimalsareNpcsEnabled
net.minecraft.server.levelGenerationChunkHolder#getGenerationRefCountServerPlayersetPlayerInputteleportTo(ServerLevel, double, double, double, float, float, boolean)
net.minecraft.tagsTagManagerTagManagerSerialization$TagOutput
net.minecraft.world.entityAnimationState#updateTimeEntitywalkDist0、walkDistwasOnFiretryCheckInsideBlocks
EntitySelector$MobCanWearArmorEntitySelector
net.minecraft.world.entity.ai.sensingBreezeAttackEntitySensor#BREEZE_SENSOR_RADIUSTemptingSensor#TEMPTATION_RANGE
net.minecraft.world.entity.animalCat#getTextureIdSquid#setMovementVectorWolf#isWet
net.minecraft.world.entity.boss.dragon.EnderDragongetLatencyPosgetHeadPartYOffset
net.minecraft.world.entity.monster.Zombie#supportsBreakDoorGoalnet.minecraft.world.entity.npc.Villager#setChasing、isChasingnet.minecraft.world.entity.projectileAbstractArrow#shotFromCrossbowThrowableProjectile(EntityType, LivingEntity, Level)
net.minecraft.world.itemBannerPatternItem#getDisplayNameItemStack#LIST_STREAM_CODEC
net.minecraft.world.level.BlockGetter#getMaxLightLevelnet.minecraft.world.level.block.entity.JigsawBlockEntity$JointType#byNamenet.minecraft.world.level.block.state.BlockBehaviour#isOcclusionShapeFullBlocknet.minecraft.world.level.chunk.ChunkAccess#setBlendingDatanet.minecraft.world.level.storage.loot.LootDataType#deserializenet.minecraft.world.phys.AABB#getBottomCenternet.minecraft.world.phys.shapes.Shapes#getFaceShapenet.minecraft.world.ticks.SavedTick#saveTick