From 135633b2adca5f716da8c6d96066e993f0270e04 Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 16 Jan 2014 19:45:42 -0500 Subject: [PATCH] Fire a custom packet channel registration/deregistration event, for any mods that care about that kind of thing --- .../cpw/mods/fml/client/FMLClientHandler.java | 17 +++++++++++++++++ .../cpw/mods/fml/common/FMLCommonHandler.java | 9 +++++---- .../cpw/mods/fml/common/IFMLSidedHandler.java | 4 ++++ .../fml/common/network/FMLNetworkEvent.java | 15 +++++++++++++++ .../handshake/ChannelRegistrationHandler.java | 16 +++++++++------- .../cpw/mods/fml/server/FMLServerHandler.java | 10 ++++++++++ 6 files changed, 60 insertions(+), 11 deletions(-) diff --git a/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java b/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java index 8ae106b58..cfe7c13ef 100644 --- a/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java +++ b/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java @@ -17,6 +17,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Map.Entry; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -43,6 +44,7 @@ import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.launchwrapper.Launch; import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; import net.minecraft.network.ServerStatusResponse; import net.minecraft.server.MinecraftServer; @@ -70,6 +72,8 @@ import cpw.mods.fml.common.ModContainer; import cpw.mods.fml.common.ModMetadata; import cpw.mods.fml.common.ObfuscationReflectionHelper; import cpw.mods.fml.common.WrongMinecraftVersionException; +import cpw.mods.fml.common.eventhandler.EventBus; +import cpw.mods.fml.common.network.FMLNetworkEvent; import cpw.mods.fml.common.registry.GameData; import cpw.mods.fml.common.toposort.ModSortingException; import cpw.mods.fml.relauncher.Side; @@ -710,4 +714,17 @@ public class FMLClientHandler implements IFMLSidedHandler throw new RuntimeException("Timeout waiting for client thread to catch up!"); } } + + @Override + public void fireNetRegistrationEvent(EventBus bus, NetworkManager manager, Set channelSet, String channel, Side side) + { + if (side == Side.CLIENT) + { + bus.post(new FMLNetworkEvent.CustomPacketRegistrationEvent(manager, channelSet, channel, side, NetHandlerPlayClient.class)); + } + else + { + bus.post(new FMLNetworkEvent.CustomPacketRegistrationEvent(manager, channelSet, channel, side, NetHandlerPlayServer.class)); + } + } } diff --git a/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java b/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java index a84035523..2604b456a 100644 --- a/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java +++ b/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java @@ -15,7 +15,6 @@ package cpw.mods.fml.common; import java.util.List; import java.util.Map; import java.util.Set; - import net.minecraft.crash.CrashReport; import net.minecraft.crash.CrashReportCategory; import net.minecraft.entity.item.EntityItem; @@ -30,10 +29,8 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; import net.minecraft.world.storage.SaveHandler; import net.minecraft.world.storage.WorldInfo; - import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; - import com.google.common.base.Joiner; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; @@ -42,7 +39,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.MapMaker; import com.google.common.collect.Maps; import com.google.common.collect.Sets; - import cpw.mods.fml.common.eventhandler.EventBus; import cpw.mods.fml.common.gameevent.InputEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; @@ -503,4 +499,9 @@ public class FMLCommonHandler { sidedDelegate.waitForPlayClient(); } + + public void fireNetRegistrationEvent(NetworkManager manager, Set channelSet, String channel, Side side) + { + sidedDelegate.fireNetRegistrationEvent(bus(), manager, channelSet, channel, side); + } } diff --git a/fml/src/main/java/cpw/mods/fml/common/IFMLSidedHandler.java b/fml/src/main/java/cpw/mods/fml/common/IFMLSidedHandler.java index 77d98b2ff..a75e8b015 100644 --- a/fml/src/main/java/cpw/mods/fml/common/IFMLSidedHandler.java +++ b/fml/src/main/java/cpw/mods/fml/common/IFMLSidedHandler.java @@ -13,10 +13,12 @@ package cpw.mods.fml.common; import java.util.List; +import java.util.Set; import net.minecraft.network.INetHandler; import net.minecraft.network.NetworkManager; import net.minecraft.server.MinecraftServer; +import cpw.mods.fml.common.eventhandler.EventBus; import cpw.mods.fml.relauncher.Side; public interface IFMLSidedHandler @@ -50,4 +52,6 @@ public interface IFMLSidedHandler INetHandler getClientPlayHandler(); void waitForPlayClient(); + + void fireNetRegistrationEvent(EventBus bus, NetworkManager manager, Set channelSet, String channel, Side side); } diff --git a/fml/src/main/java/cpw/mods/fml/common/network/FMLNetworkEvent.java b/fml/src/main/java/cpw/mods/fml/common/network/FMLNetworkEvent.java index e2f26f9bf..3974ecc33 100644 --- a/fml/src/main/java/cpw/mods/fml/common/network/FMLNetworkEvent.java +++ b/fml/src/main/java/cpw/mods/fml/common/network/FMLNetworkEvent.java @@ -1,5 +1,7 @@ package cpw.mods.fml.common.network; +import java.util.Set; +import com.google.common.collect.ImmutableSet; import net.minecraft.network.INetHandler; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.INetHandlerPlayClient; @@ -52,6 +54,19 @@ public class FMLNetworkEvent extends Event { } } + public static class CustomPacketRegistrationEvent extends FMLNetworkEvent { + public final ImmutableSet registrations; + public final String operation; + public final Side side; + public CustomPacketRegistrationEvent(NetworkManager manager, Set registrations, String operation, Side side, Class type) + { + super(type.cast(manager.func_150729_e()), type, manager); + this.registrations = ImmutableSet.copyOf(registrations); + this.side = side; + this.operation = operation; + } + } + public static abstract class CustomPacketEvent extends FMLNetworkEvent { /** * The packet that generated the event diff --git a/fml/src/main/java/cpw/mods/fml/common/network/handshake/ChannelRegistrationHandler.java b/fml/src/main/java/cpw/mods/fml/common/network/handshake/ChannelRegistrationHandler.java index d76719ec5..76710246e 100644 --- a/fml/src/main/java/cpw/mods/fml/common/network/handshake/ChannelRegistrationHandler.java +++ b/fml/src/main/java/cpw/mods/fml/common/network/handshake/ChannelRegistrationHandler.java @@ -1,28 +1,30 @@ package cpw.mods.fml.common.network.handshake; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import java.util.Set; +import net.minecraft.network.NetworkManager; import com.google.common.base.Charsets; - +import com.google.common.collect.ImmutableSet; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.internal.FMLProxyPacket; import cpw.mods.fml.relauncher.Side; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; public class ChannelRegistrationHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, FMLProxyPacket msg) throws Exception { Side side = ctx.channel().attr(NetworkRegistry.CHANNEL_SOURCE).get(); + NetworkManager manager = msg.getOrigin(); if (msg.channel().equals("REGISTER") || msg.channel().equals("UNREGISTER")) { byte[] data = new byte[msg.payload().readableBytes()]; msg.payload().readBytes(data); String channels = new String(data,Charsets.UTF_8); String[] split = channels.split("\0"); - for (String channel : split) - { - System.out.printf("Register %s from %s\n",channel, side); - } + Set channelSet = ImmutableSet.copyOf(split); + FMLCommonHandler.instance().fireNetRegistrationEvent(manager, channelSet, msg.channel(), side); } else { diff --git a/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java b/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java index 3dac409ad..b4965d068 100644 --- a/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java +++ b/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java @@ -17,12 +17,14 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; import net.minecraft.server.MinecraftServer; import net.minecraft.util.StringTranslate; @@ -34,6 +36,8 @@ import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.IFMLSidedHandler; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModContainer; +import cpw.mods.fml.common.eventhandler.EventBus; +import cpw.mods.fml.common.network.FMLNetworkEvent; import cpw.mods.fml.common.registry.LanguageRegistry; import cpw.mods.fml.relauncher.Side; @@ -226,4 +230,10 @@ public class FMLServerHandler implements IFMLSidedHandler { // NOOP } + + @Override + public void fireNetRegistrationEvent(EventBus bus, NetworkManager manager, Set channelSet, String channel, Side side) + { + bus.post(new FMLNetworkEvent.CustomPacketRegistrationEvent(manager, channelSet, channel, side, NetHandlerPlayServer.class)); + } }