diff --git a/src/main/java/org/ultramine/mods/bukkit/interfaces/fml/network/handshake/IMixinNetworkDispatcher.java b/src/main/java/org/ultramine/mods/bukkit/interfaces/fml/network/handshake/IMixinNetworkDispatcher.java new file mode 100644 index 0000000..8828bea --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/interfaces/fml/network/handshake/IMixinNetworkDispatcher.java @@ -0,0 +1,8 @@ +package org.ultramine.mods.bukkit.interfaces.fml.network.handshake; + +import net.minecraft.entity.player.EntityPlayerMP; + +public interface IMixinNetworkDispatcher +{ + EntityPlayerMP getPlayer(); +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/MixinEntityLivingBase.java b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/MixinEntityLivingBase.java index 91b394d..239d675 100644 --- a/src/main/java/org/ultramine/mods/bukkit/mixin/entity/MixinEntityLivingBase.java +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/entity/MixinEntityLivingBase.java @@ -193,7 +193,7 @@ if(f1 > 0.0F) { - EntityRegainHealthEvent event = new EntityRegainHealthEvent(((IMixinEntity) this).getBukkitEntity(), p_70691_1_, regainReason); + EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), p_70691_1_, regainReason); ((IMixinWorld) worldObj).getServer().getPluginManager().callEvent(event); if(!event.isCancelled()) @@ -209,7 +209,7 @@ // CraftBukkit start - Use unscaled health if((Object) this instanceof EntityPlayerMP) { - return (float) ((Player) ((IMixinEntity) this).getBukkitEntity()).getHealth(); + return (float) ((Player) this.getBukkitEntity()).getHealth(); } // CraftBukkit end return this.dataWatcher.getWatchableObjectFloat(6); @@ -221,7 +221,7 @@ // CraftBukkit start - Handle scaled health if((Object) this instanceof EntityPlayerMP) { - CraftPlayer player = (CraftPlayer) ((IMixinEntity) this).getBukkitEntity(); + CraftPlayer player = (CraftPlayer) this.getBukkitEntity(); // Squeeze if(p_70606_1_ < 0.0F) diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/fml/network/handshake/MixinChannelRegistrationHandler.java b/src/main/java/org/ultramine/mods/bukkit/mixin/fml/network/handshake/MixinChannelRegistrationHandler.java new file mode 100644 index 0000000..152cc75 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/fml/network/handshake/MixinChannelRegistrationHandler.java @@ -0,0 +1,42 @@ +package org.ultramine.mods.bukkit.mixin.fml.network.handshake; + +import com.google.common.collect.ImmutableSet; +import cpw.mods.fml.common.network.handshake.NetworkDispatcher; +import cpw.mods.fml.common.network.internal.FMLProxyPacket; +import io.netty.channel.ChannelHandlerContext; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity; +import org.ultramine.mods.bukkit.interfaces.fml.network.handshake.IMixinNetworkDispatcher; + +@Mixin(cpw.mods.fml.common.network.handshake.ChannelRegistrationHandler.class) +public class MixinChannelRegistrationHandler +{ + @Redirect(method = "channelRead0", remap = false, + at = @At(value = "INVOKE", target = "Lcom/google/common/collect/ImmutableSet;copyOf([Ljava/lang/Object;)Lcom/google/common/collect/ImmutableSet;", ordinal = 2)) + private ImmutableSet onChannelRead0(Object[] splitObjs, ChannelHandlerContext ctx, FMLProxyPacket msg) + { + String[] split = (String[])splitObjs; + // Cauldron start - register bukkit channels for players + NetworkDispatcher dispatcher = ctx.channel().attr(NetworkDispatcher.FML_DISPATCHER).get(); + CraftPlayer player = (CraftPlayer)((IMixinEntity)((IMixinNetworkDispatcher) dispatcher).getPlayer()).getBukkitEntity(); + if (msg.channel().equals("REGISTER")) + { + for (String channel : split) + { + player.addChannel(channel); + } + } + else + { + for (String channel : split) + { + player.removeChannel(channel); + } + } + // Cauldron end + return ImmutableSet.copyOf(splitObjs); + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/fml/network/handshake/MixinNetworkDispatcher.java b/src/main/java/org/ultramine/mods/bukkit/mixin/fml/network/handshake/MixinNetworkDispatcher.java new file mode 100644 index 0000000..14e18a2 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/fml/network/handshake/MixinNetworkDispatcher.java @@ -0,0 +1,32 @@ +package org.ultramine.mods.bukkit.mixin.fml.network.handshake; + +import io.netty.channel.ChannelHandlerContext; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.play.client.C17PacketCustomPayload; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity; +import org.ultramine.mods.bukkit.interfaces.fml.network.handshake.IMixinNetworkDispatcher; + +@Mixin(cpw.mods.fml.common.network.handshake.NetworkDispatcher.class) +public class MixinNetworkDispatcher implements IMixinNetworkDispatcher +{ + @Shadow private EntityPlayerMP player; + + @Override + public EntityPlayerMP getPlayer() + { + return player; + } + + @Inject(method = "handleServerSideCustomPacket", at = @At("HEAD"), remap = false) + private void onHandleServerSideCustomPacket(C17PacketCustomPayload msg, ChannelHandlerContext context, CallbackInfoReturnable ci) + { + ((CraftPlayer) ((IMixinEntity) player).getBukkitEntity()).addChannel(msg.func_149559_c()); // Cauldron - register channel for bukkit player + } +} diff --git a/src/main/java/org/ultramine/mods/bukkit/mixin/network/MixinNetHPlayS.java b/src/main/java/org/ultramine/mods/bukkit/mixin/network/MixinNetHPlayS.java index ea718d1..e238d0b 100644 --- a/src/main/java/org/ultramine/mods/bukkit/mixin/network/MixinNetHPlayS.java +++ b/src/main/java/org/ultramine/mods/bukkit/mixin/network/MixinNetHPlayS.java @@ -7,6 +7,7 @@ import net.minecraft.network.play.client.C08PacketPlayerBlockPlacement; import net.minecraft.network.play.client.C09PacketHeldItemChange; import net.minecraft.network.play.client.C12PacketUpdateSign; +import net.minecraft.network.play.client.C17PacketCustomPayload; import net.minecraft.network.play.server.S09PacketHeldItemChange; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntitySign; @@ -162,4 +163,14 @@ ci.cancel(); } + + @Inject(method = "processVanilla250Packet", at = @At("HEAD")) + public void onProcessVanilla250Packet(C17PacketCustomPayload p_147349_1_, CallbackInfo ci) + { + // CraftBukkit start + // Cauldron - bukkit registration moved to FML's ChannelRegistrationHandler + if(p_147349_1_.func_149558_e() != null) + Bukkit.getServer().getMessenger().dispatchIncomingMessage(getPlayerB(), p_147349_1_.func_149559_c(), p_147349_1_.func_149558_e()); + // CraftBukkit end + } } diff --git a/src/main/resources/mixin.umbukkitimpl.json b/src/main/resources/mixin.umbukkitimpl.json index d80d3fa..a7a210f 100644 --- a/src/main/resources/mixin.umbukkitimpl.json +++ b/src/main/resources/mixin.umbukkitimpl.json @@ -52,6 +52,8 @@ "world.MixinWorld", "world.MixinWorldServer", "world.MixinExplosion", - "world.storage.MixinSaveHandler" + "world.storage.MixinSaveHandler", + "fml.network.handshake.MixinChannelRegistrationHandler", + "fml.network.handshake.MixinNetworkDispatcher" ] } \ No newline at end of file