Make dynamic codecs actually work
This commit is contained in:
parent
11fe75578c
commit
25dc08eb79
|
|
@ -1,23 +1,26 @@
|
||||||
package org.embeddedt.modernfix.common.mixin.perf.dynamic_block_codecs;
|
package org.embeddedt.modernfix.common.mixin.perf.dynamic_block_codecs;
|
||||||
|
|
||||||
import com.mojang.serialization.MapCodec;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.StateDefinition;
|
import net.minecraft.world.level.block.state.StateDefinition;
|
||||||
import net.minecraft.world.level.block.state.StateHolder;
|
import net.minecraft.world.level.block.state.StateHolder;
|
||||||
|
import net.minecraft.world.level.block.state.properties.Property;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
import org.spongepowered.asm.mixin.injection.ModifyVariable;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
@Mixin(StateDefinition.class)
|
@Mixin(StateDefinition.class)
|
||||||
public class StateDefinitionMixin<O, S extends StateHolder<O, S>> {
|
public class StateDefinitionMixin<O, S extends StateHolder<O, S>> {
|
||||||
@Shadow @Final private O owner;
|
@Shadow @Final private O owner;
|
||||||
|
|
||||||
@ModifyVariable(method = "<init>", at = @At(value = "INVOKE", target = "Lcom/google/common/collect/Maps;newLinkedHashMap()Ljava/util/LinkedHashMap;"), ordinal = 0)
|
@ModifyVariable(method = "<init>", at = @At("HEAD"), ordinal = 0, argsOnly = true)
|
||||||
private MapCodec<?> replaceMapCodec(MapCodec<?> codec) {
|
private static <O, S extends StateHolder<O, S>> StateDefinition.Factory<O, S> replaceMapCodec(StateDefinition.Factory<O, S> factory, Function<O, S> function, O object, StateDefinition.Factory<O, S> factory2, Map<String, Property<?>> map) {
|
||||||
if(this.owner instanceof Block)
|
if(object instanceof Block)
|
||||||
return null;
|
return (o, m, c) -> factory.create(o, m, null);
|
||||||
return codec;
|
return factory;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import com.mojang.serialization.Codec;
|
||||||
import com.mojang.serialization.Decoder;
|
import com.mojang.serialization.Decoder;
|
||||||
import com.mojang.serialization.Encoder;
|
import com.mojang.serialization.Encoder;
|
||||||
import com.mojang.serialization.MapCodec;
|
import com.mojang.serialization.MapCodec;
|
||||||
import net.minecraft.core.Registry;
|
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import net.minecraft.world.level.block.state.StateDefinition;
|
import net.minecraft.world.level.block.state.StateDefinition;
|
||||||
|
|
@ -28,7 +27,6 @@ public class StateHolderMixin {
|
||||||
.build(new CacheLoader<Block, MapCodec<BlockState>>() {
|
.build(new CacheLoader<Block, MapCodec<BlockState>>() {
|
||||||
@Override
|
@Override
|
||||||
public MapCodec<BlockState> load(Block block) throws Exception {
|
public MapCodec<BlockState> load(Block block) throws Exception {
|
||||||
System.out.println("Generating codec for " + Registry.BLOCK.getKey(block));
|
|
||||||
Supplier<BlockState> stateSupplier = block::defaultBlockState;
|
Supplier<BlockState> stateSupplier = block::defaultBlockState;
|
||||||
MapCodec<BlockState> mapCodec = MapCodec.of(Encoder.empty(), Decoder.unit(stateSupplier));
|
MapCodec<BlockState> mapCodec = MapCodec.of(Encoder.empty(), Decoder.unit(stateSupplier));
|
||||||
for(Property<?> property : block.getStateDefinition().getProperties()) {
|
for(Property<?> property : block.getStateDefinition().getProperties()) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user