抽象通用对象类

时间:2020-03-12 14:13:16

标签: java class

在Minecraft游戏中,您必须在客户端和服务器之间发送数据才能同步内容,在特定情况下需要同步的内容之一是TileEntities与渲染。数据存储在服务器上并发送到客户端,此后用于渲染。

您将创建一个包含需要同步的数据的类,并将其附加到名为“ SimpleImpl”的通道创建API中。我的网络对象和消息对象:

public class IntercraftPacketHandler
{

    private static int index = 1;

    private static final ResourceLocation CHANNEL_NAME     = new ResourceLocation(Reference.MODID,"network");
    private static final String           PROTOCOL_VERSION = new ResourceLocation(Reference.MODID,"1").toString();


    public static SimpleChannel getNetworkChannel()
    {
        final SimpleChannel channel = NetworkRegistry.ChannelBuilder.named(CHANNEL_NAME)
                .clientAcceptedVersions(version -> true)
                .serverAcceptedVersions(version -> true)
                .networkProtocolVersion(()      -> PROTOCOL_VERSION)
                .simpleChannel();

        // Sync Capability Identity Hidden data message.

        channel.messageBuilder(MessageIdentityHidden.class,index)
                .encoder(MessageIdentityHidden::encode)
                .decoder(MessageIdentityHidden::decode)
                .consumer(MessageIdentityHidden::handle)
                .add(); index++;

        // Send TreeTapTileEntity data to client.

        channel.messageBuilder(MessageTreeTap.class,index)
                .encoder(MessageTreeTap::encode)
                .decoder(MessageTreeTap::decode)
                .consumer(MessageTreeTap::handle)
                .add(); index++;

        // Send ChunkLoaderTileEntity data to client.

        channel.messageBuilder(MessageChunkLoader.class,index)
                .encoder(MessageChunkLoader::encode)
                .decoder(MessageChunkLoader::decode)
                .consumer(MessageChunkLoader::handle)
                .add(); index++;

        return channel;
    }

}
public class MessageChunkLoader
{
    private BlockPos pos;
    private boolean  canLoad;

    public MessageChunkLoader(BlockPos pos,boolean canLoad)
    {
        this.pos     = pos;
        this.canLoad = canLoad;
    }


    public void handle(Supplier<NetworkEvent.Context> ctx)
    {
        ctx.get().enqueueWork(() -> {
            try {
                ChunkLoaderBaseTileEntity tile = (ChunkLoaderBaseTileEntity) Minecraft.getInstance().world.getTileEntity(pos);
                tile.canLoad = canLoad;

            } catch (NullPointerException err) {
                System.out.println(String.format("Could not find ChunkLoaderTileEntity at %s %s %s!",pos.getX(),pos.getY(),pos.getZ()));
            }

        });
    }

    public static void encode(MessageChunkLoader message, PacketBuffer buffer)
    {
        buffer.writeBlockPos(message.pos);
        buffer.writeBoolean(message.canLoad);
    }

    public static MessageChunkLoader decode(final PacketBuffer buffer)
    {
        return new MessageChunkLoader(buffer.readBlockPos(),buffer.readBoolean());
    }
}

然后在我的mod项目中的对象使用的主mod类中对其进行初始化。

@Mod(Reference.MODID)
public class IntercraftCore
{
    public static final SimpleChannel NETWORK = IntercraftPacketHandler.getNetworkChannel();
...

问题和帖子的问题;现在,我根据在MessageChunkLoader中遵循的公式(公共静态编码和解码方法以及处理方法)创建了一个新的消息类。我想创建一个更通用的类来为TileEntities创建消息类,但是我遇到了问题。这是当前的课程:

public abstract class MessageTileEntity<T extends TileEntity>
{
    protected final BlockPos pos;
    protected final Class<T> clazz;

    public MessageTileEntity(BlockPos pos, Class<T> clazz)
    {
        this.pos = pos;
        this.clazz = clazz;
    }

    public abstract void handle(Supplier<NetworkEvent.Context> ctx);

    protected T getTileEntity()
    {
        try {
            return clazz.cast(Minecraft.getInstance().world.getTileEntity(pos));
        } catch (NullPointerException e) {
            System.out.println(String.format("Could not find %s at [%d %d %d]!",clazz.getSimpleName(),pos.getX(),pos.getY(),pos.getZ()));
            throw e;
        } catch (ClassCastException e) {
            System.out.println(String.format("TileEntity at [%d %d %d] is not %s!",pos.getX(),pos.getY(),pos.getZ(),clazz.getSimpleName()));
            throw e;
        }
    }

    public static void encode(MessageTileEntity message, PacketBuffer buffer)
    {

    }

    public static MessageTileEntity decode(final PacketBuffer buffer)
    {
        return null;
    }
}

主要问题是我缺乏适当的Java技能来使其像我希望的那样工作。方法handle很简单,因为它是非静态的,并且需要为每条TileEntity消息自定义,但是方法encodedecode需要静态,这给我带来了麻烦。我不知道我要达到的目标是可能的,问问不会有伤害。也许解决方案比我想的容易。

0 个答案:

没有答案
相关问题