- 3,649
- 100
- 718
Собсна, все наверное заметили, что я обновил пакетную систему у себя в ресурсах, но как оказалось, она не очень удобна в плане обработки входящих пакетов. Я слегка переписал интерфейс SimplePacket и мне нужно, чтобы кто-то протестировал у себя его. А теперь перейдём к впоросу, а чё это я сам не могу запустить и проверить? Отвечаю, обновлённый код пилил в боевом паблике проекте(Glibys Voice Chat Reloaded), но так как мод ещё не готов, я не могу самостоятельно проверить. В общем сам код:
С вас 1.13.2 forge и feedback.
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);
}
}
}
}
Последнее редактирование: