Нужны жертвы

Icosider

Kotliner
Администратор
3,649
100
718
Собсна, все наверное заметили, что я обновил пакетную систему у себя в ресурсах, но как оказалось, она не очень удобна в плане обработки входящих пакетов. Я слегка переписал интерфейс SimplePacket и мне нужно, чтобы кто-то протестировал у себя его. А теперь перейдём к впоросу, а чё это я сам не могу запустить и проверить? Отвечаю, обновлённый код пилил в боевом паблике проекте(Glibys Voice Chat Reloaded), но так как мод ещё не готов, я не могу самостоятельно проверить. В общем сам код:
Java:
package networking;

import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityPlayerSP;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Particles;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.dimension.DimensionType;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.fml.network.NetworkEvent;
import net.minecraftforge.fml.network.NetworkRegistry;
import net.minecraftforge.fml.network.PacketDistributor;
import net.minecraftforge.fml.network.simple.SimpleChannel;

import java.util.List;
import java.util.function.Supplier;

public class NetworkHandler {
    private static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel(
            new ResourceLocation("modid", "channelName"), () -> "2.0", client ->  true, server -> true);

    private short id = 0;

    public NetworkHandler() {}

    public void sendTo(Packet packet, EntityPlayerMP player) {
        CHANNEL.send(PacketDistributor.PLAYER.with(() -> player), packet);
    }

    public void sendToAll(Packet packet) {
        CHANNEL.send(PacketDistributor.ALL.noArg(), packet);
    }

    public void sendToNear(Packet packet, PacketDistributor.TargetPoint point) {
        CHANNEL.send(PacketDistributor.NEAR.with(() -> point), packet);
    }

    public void sendToServer(Packet packet) {
        CHANNEL.send(PacketDistributor.SERVER.noArg(), packet);
    }

    public void sendToDim(Packet packet, DimensionType type) {
        CHANNEL.send(PacketDistributor.DIMENSION.with(() -> type), packet);
    }

    public void sendToTracking(Packet packet, Entity entity) {
        CHANNEL.send(PacketDistributor.TRACKING_ENTITY.with(() -> entity), packet);
    }

    public void sendToTrackingAndSelf(Packet packet, Entity entity) {
        CHANNEL.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with(() -> entity), packet);
    }

    public void sendToTrackingChunk(Packet packet, Chunk chunk) {
        CHANNEL.send(PacketDistributor.TRACKING_CHUNK.with(() -> chunk), packet);
    }

    public void sendToSeveralPlayers(Packet packet, List<NetworkManager> managers) {
        CHANNEL.send(PacketDistributor.NMLIST.with(() -> managers), packet);
    }

    private void registerPacket(Class<Packet> clazz) {
        try {
            final Packet packet = clazz.newInstance();
            CHANNEL.registerMessage(id++, clazz, packet::encode, packet::decode, packet::handlePacket);
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public abstract class Packet {
        abstract void encode(Packet packet, PacketBuffer buf);
        abstract Packet decode(PacketBuffer buf);

        void handlePacket(Packet packet, Supplier<NetworkEvent.Context> context) {
            final NetworkEvent.Context ctx = context.get();

            if (ctx.getDirection().getReceptionSide() == LogicalSide.SERVER) {
                ctx.enqueueWork(() -> packet.server(ctx.getSender()));
                ctx.setPacketHandled(true);
            } else
                Minecraft.getInstance().addScheduledTask(() -> packet.client(clientPlayer()));
        }

        void client(EntityPlayerSP player) {}
        void server(EntityPlayerMP player) {}

        @OnlyIn(Dist.CLIENT)
        private EntityPlayerSP clientPlayer() {
            return Minecraft.getInstance().player;
        }
    }

    public class SPacketParticles extends Packet {
        @Override
        public void encode(Packet simplePacket, PacketBuffer buf) {}

        @Override
        public SPacketParticles decode(PacketBuffer buf) {
            return null;
        }

        @Override
        public void server(EntityPlayerMP player) {
            NETWORK.sendToNear(new CPacketParticles(),
                    new PacketDistributor.TargetPoint(player.posX, player.posY, player.posZ, 64.0, player.dimension));
        }
    }

    public class CPacketParticles extends Packet {
        public double x, y, z;

        public CPacketParticles() {}
        public CPacketParticles(double x, double y, double z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }

        @Override
        public void encode(Packet simplePacket, PacketBuffer buf) {
            buf.writeDouble(x);
            buf.writeDouble(y);
            buf.writeDouble(z);
        }

        @Override
        public CPacketParticles decode(PacketBuffer buf) {
            this.x = buf.readDouble();
            this.y = buf.readDouble();
            this.z = buf.readDouble();
            return null;
        }

        @Override
        public void client(EntityPlayerSP player) {
            final double twicePi = Math.PI * 2;
            double nX, nZ, speedX, speedZ;

            for (double i = 0; i < twicePi; i += twicePi / 50) {
                nX = this.x + .4F * Math.cos(i);
                nZ = this.z + .4F * Math.sin(i);

                speedX = (nX - this.x) * .2D;
                speedZ = (nZ - this.z) * .2D;

                player.world.spawnParticle(Particles.FLAME, nX, this.y, nZ, speedX, .0, speedZ);
            }
        }
    }
}
С вас 1.13.2 forge и feedback.
 
Последнее редактирование:
Назад
Сверху