SavedDataFeaturePoolElementFix.java
net.minecraft.util.datafix.fixes.SavedDataFeaturePoolElementFix
信息
- 全限定名:net.minecraft.util.datafix.fixes.SavedDataFeaturePoolElementFix
- 类型:public class
- 包:net.minecraft.util.datafix.fixes
- 源码路径:src/main/java/net/minecraft/util/datafix/fixes/SavedDataFeaturePoolElementFix.java
- 起始行号:L19
- 继承:DataFix
- 职责:
TODO
字段/常量
-
INDEX_PATTERN- 类型:
Pattern - 修饰符:
private static final - 源码定位:
L20 - 说明:
TODO
- 类型:
-
PIECE_TYPE- 类型:
Set<String> - 修饰符:
private static final - 源码定位:
L21 - 说明:
TODO
- 类型:
-
FEATURES- 类型:
Set<String> - 修饰符:
private static final - 源码定位:
L24 - 说明:
TODO
- 类型:
内部类/嵌套类型
- 无
构造器
public SavedDataFeaturePoolElementFix(Schema outputSchema) @ L26
- 构造器名:SavedDataFeaturePoolElementFix
- 源码定位:L26
- 修饰符:public
参数:
- outputSchema: Schema
说明:
TODO
方法
下面的方法块按源码顺序生成。
public TypeRewriteRule makeRule() @ L30
- 方法名:makeRule
- 源码定位:L30
- 返回类型:TypeRewriteRule
- 修饰符:public
参数:
- 无
说明:
TODO
private static <T> Dynamic<T> fixTag(Dynamic<T> input) @ L40
- 方法名:fixTag
- 源码定位:L40
- 返回类型:
Dynamic - 修饰符:private static
参数:
- input: Dynamic
说明:
TODO
private static <T> Dynamic<T> updateChildren(Dynamic<T> input) @ L44
- 方法名:updateChildren
- 源码定位:L44
- 返回类型:
Dynamic - 修饰符:private static
参数:
- input: Dynamic
说明:
TODO
private static Stream<?extends Dynamic<?>> updateChildren(Stream<?extends Dynamic<?>> stream) @ L48
- 方法名:updateChildren
- 源码定位:L48
- 返回类型:Stream>
- 修饰符:private static
参数:
- stream: Stream>
说明:
TODO
private static <T> OptionalDynamic<T> get(Dynamic<T> input, String... path) @ L64
- 方法名:get
- 源码定位:L64
- 返回类型:
OptionalDynamic - 修饰符:private static
参数:
- input: Dynamic
- path: String…
说明:
TODO
protected static Dynamic<?> fixFeature(Dynamic<?> value) @ L90
- 方法名:fixFeature
- 源码定位:L90
- 返回类型:Dynamic<?>
- 修饰符:protected static
参数:
- value: Dynamic<?>
说明:
TODO
private static Optional<String> getReplacement(String type, String name, String stateProviderType, String stateProviderState, String stateProviderFirstWeighedState, String foliagePlacerType, String leavesProviderState) @ L104
- 方法名:getReplacement
- 源码定位:L104
- 返回类型:Optional
- 修饰符:private static
参数:
- type: String
- name: String
- stateProviderType: String
- stateProviderState: String
- stateProviderFirstWeighedState: String
- foliagePlacerType: String
- leavesProviderState: String
说明:
TODO
代码
public class SavedDataFeaturePoolElementFix extends DataFix {
private static final Pattern INDEX_PATTERN = Pattern.compile("\\[(\\d+)\\]");
private static final Set<String> PIECE_TYPE = Sets.newHashSet(
"minecraft:jigsaw", "minecraft:nvi", "minecraft:pcp", "minecraft:bastionremnant", "minecraft:runtime"
);
private static final Set<String> FEATURES = Sets.newHashSet("minecraft:tree", "minecraft:flower", "minecraft:block_pile", "minecraft:random_patch");
public SavedDataFeaturePoolElementFix(Schema outputSchema) {
super(outputSchema, false);
}
@Override
public TypeRewriteRule makeRule() {
return this.writeFixAndRead(
"SavedDataFeaturePoolElementFix",
this.getInputSchema().getType(References.STRUCTURE_FEATURE),
this.getOutputSchema().getType(References.STRUCTURE_FEATURE),
SavedDataFeaturePoolElementFix::fixTag
);
}
private static <T> Dynamic<T> fixTag(Dynamic<T> input) {
return input.update("Children", SavedDataFeaturePoolElementFix::updateChildren);
}
private static <T> Dynamic<T> updateChildren(Dynamic<T> input) {
return input.asStreamOpt().map(SavedDataFeaturePoolElementFix::updateChildren).map(input::createList).result().orElse(input);
}
private static Stream<? extends Dynamic<?>> updateChildren(Stream<? extends Dynamic<?>> stream) {
return stream.map(
child -> {
String id = child.get("id").asString("");
if (!PIECE_TYPE.contains(id)) {
return child;
} else {
OptionalDynamic<?> poolElement = child.get("pool_element");
return !poolElement.get("element_type").asString("").equals("minecraft:feature_pool_element")
? child
: child.update("pool_element", pool -> pool.update("feature", SavedDataFeaturePoolElementFix::fixFeature));
}
}
);
}
private static <T> OptionalDynamic<T> get(Dynamic<T> input, String... path) {
if (path.length == 0) {
throw new IllegalArgumentException("Missing path");
} else {
OptionalDynamic<T> output = input.get(path[0]);
for (int i = 1; i < path.length; i++) {
String element = path[i];
Matcher matcher = INDEX_PATTERN.matcher(element);
if (matcher.matches()) {
int id = Integer.parseInt(matcher.group(1));
List<? extends Dynamic<T>> dynamics = output.asList(Function.identity());
if (id >= 0 && id < dynamics.size()) {
output = new OptionalDynamic<>(input.getOps(), DataResult.success((Dynamic<T>)dynamics.get(id)));
} else {
output = new OptionalDynamic<>(input.getOps(), DataResult.error(() -> "Missing id:" + id));
}
} else {
output = output.get(element);
}
}
return output;
}
}
@VisibleForTesting
protected static Dynamic<?> fixFeature(Dynamic<?> value) {
Optional<String> replacement = getReplacement(
get(value, "type").asString(""),
get(value, "name").asString(""),
get(value, "config", "state_provider", "type").asString(""),
get(value, "config", "state_provider", "state", "Name").asString(""),
get(value, "config", "state_provider", "entries", "[0]", "data", "Name").asString(""),
get(value, "config", "foliage_placer", "type").asString(""),
get(value, "config", "leaves_provider", "state", "Name").asString("")
);
return replacement.isPresent() ? value.createString(replacement.get()) : value;
}
private static Optional<String> getReplacement(
String type,
String name,
String stateProviderType,
String stateProviderState,
String stateProviderFirstWeighedState,
String foliagePlacerType,
String leavesProviderState
) {
String feature;
if (!type.isEmpty()) {
feature = type;
} else {
if (name.isEmpty()) {
return Optional.empty();
}
if ("minecraft:normal_tree".equals(name)) {
feature = "minecraft:tree";
} else {
feature = name;
}
}
if (FEATURES.contains(feature)) {
if ("minecraft:random_patch".equals(feature)) {
if ("minecraft:simple_state_provider".equals(stateProviderType)) {
if ("minecraft:sweet_berry_bush".equals(stateProviderState)) {
return Optional.of("minecraft:patch_berry_bush");
}
if ("minecraft:cactus".equals(stateProviderState)) {
return Optional.of("minecraft:patch_cactus");
}
} else if ("minecraft:weighted_state_provider".equals(stateProviderType)
&& ("minecraft:grass".equals(stateProviderFirstWeighedState) || "minecraft:fern".equals(stateProviderFirstWeighedState))) {
return Optional.of("minecraft:patch_taiga_grass");
}
} else if ("minecraft:block_pile".equals(feature)) {
if (!"minecraft:simple_state_provider".equals(stateProviderType) && !"minecraft:rotated_block_provider".equals(stateProviderType)) {
if ("minecraft:weighted_state_provider".equals(stateProviderType)) {
if ("minecraft:packed_ice".equals(stateProviderFirstWeighedState) || "minecraft:blue_ice".equals(stateProviderFirstWeighedState)) {
return Optional.of("minecraft:pile_ice");
}
if ("minecraft:jack_o_lantern".equals(stateProviderFirstWeighedState) || "minecraft:pumpkin".equals(stateProviderFirstWeighedState)) {
return Optional.of("minecraft:pile_pumpkin");
}
}
} else {
if ("minecraft:hay_block".equals(stateProviderState)) {
return Optional.of("minecraft:pile_hay");
}
if ("minecraft:melon".equals(stateProviderState)) {
return Optional.of("minecraft:pile_melon");
}
if ("minecraft:snow".equals(stateProviderState)) {
return Optional.of("minecraft:pile_snow");
}
}
} else {
if ("minecraft:flower".equals(feature)) {
return Optional.of("minecraft:flower_plain");
}
if ("minecraft:tree".equals(feature)) {
if ("minecraft:acacia_foliage_placer".equals(foliagePlacerType)) {
return Optional.of("minecraft:acacia");
}
if ("minecraft:blob_foliage_placer".equals(foliagePlacerType) && "minecraft:oak_leaves".equals(leavesProviderState)) {
return Optional.of("minecraft:oak");
}
if ("minecraft:pine_foliage_placer".equals(foliagePlacerType)) {
return Optional.of("minecraft:pine");
}
if ("minecraft:spruce_foliage_placer".equals(foliagePlacerType)) {
return Optional.of("minecraft:spruce");
}
}
}
}
return Optional.empty();
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
Pattern.compile()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置: