diff --git a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java index 504e1b5..2ade415 100644 --- a/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java +++ b/src/main/java/org/ultramine/mods/bukkit/EventImplProgress.java @@ -165,7 +165,7 @@ reg(false, org.bukkit.event.player.PlayerItemConsumeEvent.class); reg(true, org.bukkit.event.player.PlayerItemHeldEvent.class); reg(true, org.bukkit.event.player.PlayerJoinEvent.class); //TODO support for custom join messages - reg(false, org.bukkit.event.player.PlayerKickEvent.class); + reg(true, org.bukkit.event.player.PlayerKickEvent.class); reg(false, org.bukkit.event.player.PlayerLevelChangeEvent.class); reg(true, org.bukkit.event.player.PlayerLoginEvent.class); //TODO add server hostname reg(false, org.bukkit.event.player.PlayerMoveEvent.class); 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 297ff4d..1cc3c66 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 @@ -19,8 +19,11 @@ import net.minecraft.network.play.server.S09PacketHeldItemChange; import net.minecraft.network.play.server.S2FPacketSetSlot; import net.minecraft.network.play.server.S32PacketConfirmTransaction; +import net.minecraft.network.play.server.S40PacketDisconnect; import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntitySign; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IntHashMap; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -40,6 +43,7 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.inventory.InventoryType.SlotType; import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryView; @@ -54,6 +58,7 @@ import org.ultramine.mods.bukkit.interfaces.inventory.IMixinContainer; import org.ultramine.mods.bukkit.interfaces.network.IMixinNetHPS; import org.ultramine.mods.bukkit.interfaces.network.ITimestampedPacket; +import org.ultramine.mods.bukkit.util.GenericFutureCloseChannel; import java.util.ArrayList; import java.util.HashSet; @@ -611,4 +616,19 @@ } } } + + @Overwrite + public void kickPlayerFromServer(String kickReason) + { + String leaveMessage = EnumChatFormatting.YELLOW + this.playerEntity.getCommandSenderName() + " left the game."; + PlayerKickEvent event = new PlayerKickEvent(getPlayerB(), kickReason, leaveMessage); + if (serverController.isServerRunning()) + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) + return; + // TODO: Make PlayerKickEvent#getLeaveMessage() useful. + final ChatComponentText chatcomponenttext = new ChatComponentText(event.getReason()); + this.netManager.scheduleOutboundPacket(new S40PacketDisconnect(chatcomponenttext), new GenericFutureCloseChannel(this.netManager, chatcomponenttext)); + this.netManager.disableAutoRead(); + } } diff --git a/src/main/java/org/ultramine/mods/bukkit/util/GenericFutureCloseChannel.java b/src/main/java/org/ultramine/mods/bukkit/util/GenericFutureCloseChannel.java new file mode 100644 index 0000000..db959b1 --- /dev/null +++ b/src/main/java/org/ultramine/mods/bukkit/util/GenericFutureCloseChannel.java @@ -0,0 +1,25 @@ +package org.ultramine.mods.bukkit.util; + +import io.netty.util.concurrent.Future; +import io.netty.util.concurrent.GenericFutureListener;; +import net.minecraft.network.NetworkManager; +import net.minecraft.util.ChatComponentText; + +// This class exists, because anonymous classes are not allowed in a @Mixin classes. +public class GenericFutureCloseChannel implements GenericFutureListener +{ + private final NetworkManager networkmanager; + private final ChatComponentText chatComponentText; + + public GenericFutureCloseChannel(NetworkManager networkManager, ChatComponentText chatComponentText) + { + this.networkmanager = networkManager; + this.chatComponentText = chatComponentText; + } + + @Override + public void operationComplete(Future future) throws Exception + { + this.networkmanager.closeChannel(chatComponentText); + } +}