9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-26 18:39:20 +00:00

feat(client-mod): 修复一些兼容性问题

This commit is contained in:
jhqwqmc
2025-03-24 11:20:05 +08:00
parent 400cd53c18
commit 1963f19039
12 changed files with 158 additions and 12 deletions

View File

@@ -2,15 +2,18 @@ package net.momirealms.craftEngineFabricMod.client;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap;
import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.registry.Registries;
import net.minecraft.util.Identifier;
import net.momirealms.craftEngineFabricMod.client.network.CraftEnginePayload;
public class CraftEngineFabricModClient implements ClientModInitializer {
public static final String MOD_ID = "craftengine";
@Override
public void onInitializeClient() {
PayloadTypeRegistry.playS2C().register(CraftEnginePayload.ID, CraftEnginePayload.CODEC);
Registries.BLOCK.forEach(block -> {
Identifier id = Registries.BLOCK.getId(block);
if (id.getNamespace().equals(CraftEngineFabricModClient.MOD_ID)) {

View File

@@ -0,0 +1,20 @@
package net.momirealms.craftEngineFabricMod.client.network;
import net.minecraft.network.RegistryByteBuf;
import net.minecraft.network.codec.PacketCodec;
public class ByteArrayCodec implements PacketCodec<RegistryByteBuf, byte[]> {
@Override
public void encode(RegistryByteBuf buf, byte[] value) {
buf.writeBytes(value);
}
@Override
public byte[] decode(RegistryByteBuf buf) {
int length = buf.readableBytes();
byte[] data = new byte[length];
buf.readBytes(data);
return data;
}
}

View File

@@ -0,0 +1,20 @@
package net.momirealms.craftEngineFabricMod.client.network;
import net.minecraft.network.RegistryByteBuf;
import net.minecraft.network.codec.PacketCodec;
import net.minecraft.network.packet.CustomPayload;
import net.minecraft.util.Identifier;
public record CraftEnginePayload(byte[] data) implements CustomPayload {
public static final Identifier ADD_CRAFTENGINE_BLOCK = Identifier.of("craftengine", "payload");
public static final Id<CraftEnginePayload> ID = new Id<>(CraftEnginePayload.ADD_CRAFTENGINE_BLOCK);
public static final PacketCodec<RegistryByteBuf, CraftEnginePayload> CODEC = PacketCodec.tuple(
new ByteArrayCodec(), CraftEnginePayload::data,
CraftEnginePayload::new
);
@Override
public Id<? extends CustomPayload> getId() {
return ID;
}
}

View File

@@ -1,7 +1,10 @@
package net.momirealms.craftEngineFabricMod;
import net.fabricmc.api.ModInitializer;
import net.minecraft.block.BlockState;
import net.minecraft.util.Identifier;
import net.momirealms.craftEngineFabricMod.util.BlockUtils;
import net.momirealms.craftEngineFabricMod.util.LoggerFilter;
import net.momirealms.craftEngineFabricMod.util.RegisterBlocks;
import net.momirealms.craftEngineFabricMod.util.YamlUtils;
@@ -13,6 +16,7 @@ public class CraftEngineFabricMod implements ModInitializer {
@Override
public void onInitialize() {
LoggerFilter.filter();
try {
YamlUtils.ensureConfigFile("additional-real-blocks.yml");
YamlUtils.ensureConfigFile("mappings.yml");
@@ -21,7 +25,11 @@ public class CraftEngineFabricMod implements ModInitializer {
for (Map.Entry<Identifier, Integer> entry : map.entrySet()) {
Identifier replacedBlockId = entry.getKey();
for (int i = 0; i < entry.getValue(); i++) {
RegisterBlocks.register(replacedBlockId.getPath() + "_" + i);
BlockState blockState = YamlUtils.createBlockData("minecraft:" + replacedBlockId.getPath());
RegisterBlocks.register(
replacedBlockId.getPath() + "_" + i,
BlockUtils.canPassThrough(blockState)
);
}
}
System.out.println("Registered " + map.size() + " additional real blocks.");

View File

@@ -0,0 +1,45 @@
package net.momirealms.craftEngineFabricMod.util;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.BlockState;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Field;
import static java.util.Objects.requireNonNull;
public class BlockUtils {
private final static Field COLLIDABLE_FIELD = requireNonNull(getDeclaredField(AbstractBlock.Settings.class, boolean.class, 0));
@Nullable
public static Field getDeclaredField(final Class<?> clazz, final Class<?> type, int index) {
int i = 0;
for (final Field field : clazz.getDeclaredFields()) {
if (field.getType() == type) {
if (index == i) {
return setAccessible(field);
}
i++;
}
}
return null;
}
@NotNull
public static <T extends AccessibleObject> T setAccessible(@NotNull final T o) {
o.setAccessible(true);
return o;
}
public static boolean canPassThrough(BlockState state) {
try {
if (state == null) return false;
AbstractBlock.Settings settings = state.getBlock().getSettings();
boolean collidable = COLLIDABLE_FIELD.getBoolean(settings);
return !collidable;
} catch (IllegalAccessException e) {
throw new RuntimeException("Failed to access 'collidable' field", e);
}
}
}

View File

@@ -0,0 +1,21 @@
package net.momirealms.craftEngineFabricMod.util;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.filter.AbstractFilter;
public class LoggerFilter {
public static void filter() {
Logger rootLogger = (Logger) LogManager.getRootLogger();
rootLogger.addFilter(new AbstractFilter() {
@Override
public Result filter(LogEvent event) {
if (event.getMessage().getFormattedMessage().contains("Missing model for variant: 'craftengine:")) {
return Result.DENY;
}
return Result.NEUTRAL;
}
});
}
}

View File

@@ -2,6 +2,7 @@ package net.momirealms.craftEngineFabricMod.util;
import net.minecraft.block.AbstractBlock;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.registry.Registries;
import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey;
@@ -12,8 +13,11 @@ import net.momirealms.craftEngineFabricMod.CraftEngineFabricMod;
import java.util.function.Function;
public class RegisterBlocks {
public static Block register(String name) {
return register(name, Block::new, Block.Settings.create().nonOpaque());
@SuppressWarnings("UnusedReturnValue")
public static Block register(String name, boolean canPassThrough) {
AbstractBlock.Settings settings = Block.Settings.create().nonOpaque().strength(-1.0F, 3600000.0F);
if (canPassThrough) settings.noCollision();
return register(name, Block::new, settings);
}
public static Block register(String name, Function<AbstractBlock.Settings, Block> blockFactory, AbstractBlock.Settings settings) {

View File

@@ -102,7 +102,7 @@ public class YamlUtils {
}
}
private static BlockState createBlockData(String blockState) {
public static BlockState createBlockData(String blockState) {
try {
StringReader reader = new StringReader(blockState);
BlockArgumentParser.BlockResult arg = BlockArgumentParser.block(registryWrapper, reader, true);