mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-27 10:59:07 +00:00
feat(client-mod): 修复一些兼容性问题
This commit is contained in:
@@ -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)) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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.");
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user