Skip to content

Commit

Permalink
Add an outgoing packet interceptor and allow "silent" in "- execute a…
Browse files Browse the repository at this point in the history
…s_player"

Still pretty unintrusive and shouldn't have any conflicts with
ProtocolLib etc
  • Loading branch information
Morphan1 committed May 29, 2015
1 parent a0ca43b commit a73d215
Show file tree
Hide file tree
Showing 3 changed files with 185 additions and 7 deletions.
Expand Up @@ -18,11 +18,16 @@
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.server.ServerCommandEvent;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class ExecuteCommand extends AbstractCommand {

enum Type { AS_SERVER, AS_NPC, AS_PLAYER, AS_OP }

public DenizenCommandSender dcs = new DenizenCommandSender();
public static final List<UUID> silencedPlayers = new ArrayList<UUID>();

@Override
public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException {
Expand Down Expand Up @@ -97,9 +102,16 @@ public void execute(ScriptEntry scriptEntry) throws CommandExecutionException {
try {
PlayerCommandPreprocessEvent pcpe = new PlayerCommandPreprocessEvent(((BukkitScriptEntryData)scriptEntry.entryData).getPlayer().getPlayerEntity(), "/" + command);
Bukkit.getPluginManager().callEvent(pcpe);
if (!pcpe.isCancelled())
((BukkitScriptEntryData)scriptEntry.entryData).getPlayer().getPlayerEntity().performCommand(
pcpe.getMessage().startsWith("/") ? pcpe.getMessage().substring(1): pcpe.getMessage());
if (!pcpe.isCancelled()) {
boolean silentBool = silent.asBoolean();
Player player = ((BukkitScriptEntryData) scriptEntry.entryData).getPlayer().getPlayerEntity();
if (silentBool)
silencedPlayers.add(player.getUniqueId());
player.performCommand(pcpe.getMessage().startsWith("/") ?
pcpe.getMessage().substring(1) : pcpe.getMessage());
if (silentBool)
silencedPlayers.remove(player.getUniqueId());
}
}
catch (Throwable e) {
dB.echoError(scriptEntry.getResidingQueue(), "Exception while executing command as player.");
Expand Down
@@ -0,0 +1,169 @@
package net.aufdemrand.denizen.utilities.packets.intercept;

import io.netty.channel.ChannelHandlerContext;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import net.aufdemrand.denizen.scripts.commands.server.ExecuteCommand;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.minecraft.server.v1_8_R3.*;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;

import javax.crypto.SecretKey;
import java.lang.reflect.Field;
import java.net.SocketAddress;

public class DenizenNetworkManager extends NetworkManager {

private final NetworkManager oldManager;
private final DenizenPacketListener packetListener;

public DenizenNetworkManager(EntityPlayer entityPlayer, NetworkManager oldManager) {
super(getProtocolDirection(oldManager));
this.oldManager = oldManager;
PacketListenerPlayIn oldListener = (PacketListenerPlayIn) oldManager.getPacketListener();
this.packetListener = new DenizenPacketListener(entityPlayer, oldListener);
a(this.packetListener); // in case something caught the old manager somehow
}

public static void setNetworkManager(Player player) {
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
PlayerConnection playerConnection = entityPlayer.playerConnection;
setNetworkManager(playerConnection, new DenizenNetworkManager(entityPlayer, playerConnection.networkManager));
}

public void channelActive(ChannelHandlerContext channelhandlercontext) throws Exception {
oldManager.channelActive(channelhandlercontext);
}

public void a(EnumProtocol enumprotocol) {
oldManager.a(enumprotocol);
}

public void channelInactive(ChannelHandlerContext channelhandlercontext) throws Exception {
oldManager.channelInactive(channelhandlercontext);
}

public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) throws Exception {
oldManager.exceptionCaught(channelhandlercontext, throwable);
}

protected void a(ChannelHandlerContext channelhandlercontext, Packet packet) throws Exception {
if(oldManager.channel.isOpen()) {
try {
packet.a(this.packetListener);
} catch (Exception e) {
dB.echoError(e);
}
}
}

public void a(PacketListener packetlistener) {
oldManager.a(packetlistener);
}

public void handle(Packet packet) {
if (packet instanceof PacketPlayOutChat) {
if (ExecuteCommand.silencedPlayers.contains(packetListener.entityPlayer.getUniqueID()))
return;
}
oldManager.handle(packet);
}

public void a(Packet packet, GenericFutureListener<? extends Future<? super Void>> genericfuturelistener, GenericFutureListener<? extends Future<? super Void>>... agenericfuturelistener) {
oldManager.a(packet, genericfuturelistener, agenericfuturelistener);
}

public void a() {
oldManager.a();
}

public SocketAddress getSocketAddress() {
return oldManager.getSocketAddress();
}

public void close(IChatBaseComponent ichatbasecomponent) {
oldManager.close(ichatbasecomponent);
}

public boolean c() {
return oldManager.c();
}

public void a(SecretKey secretkey) {
oldManager.a(secretkey);
}

public boolean g() {
return oldManager.g();
}

public boolean h() {
return oldManager.h();
}

public PacketListener getPacketListener() {
return oldManager.getPacketListener();
}

public IChatBaseComponent j() {
return oldManager.j();
}

public void k() {
oldManager.k();
}

public void a(int i) {
oldManager.a(i);
}

public void l() {
oldManager.l();
}

protected void channelRead0(ChannelHandlerContext channelhandlercontext, Packet object) throws Exception {
this.a(channelhandlercontext, object);
}


//////////////////////////////////
//// Reflection Methods/Fields
///////////

private static final Field protocolDirectionField;
private static final Field networkManagerField;

static {
Field directionField = null;
Field managerField = null;
try {
directionField = NetworkManager.class.getDeclaredField("h");
directionField.setAccessible(true);
managerField = PlayerConnection.class.getDeclaredField("networkManager");
managerField.setAccessible(true);
} catch (Exception e) {
dB.echoError(e);
}
protocolDirectionField = directionField;
networkManagerField = managerField;
}

private static EnumProtocolDirection getProtocolDirection(NetworkManager networkManager) {
EnumProtocolDirection direction = null;
try {
direction = (EnumProtocolDirection) protocolDirectionField.get(networkManager);
} catch (Exception e) {
dB.echoError(e);
}
return direction;
}

private static void setNetworkManager(PlayerConnection playerConnection, NetworkManager networkManager) {
try {
networkManagerField.set(playerConnection, networkManager);
} catch (Exception e) {
dB.echoError(e);
}
}
}
Expand Up @@ -71,10 +71,7 @@ public void run() {
public static class PlayerEventListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerJoin(PlayerJoinEvent event) {
EntityPlayer entityPlayer = ((CraftPlayer) event.getPlayer()).getHandle();
NetworkManager manager = entityPlayer.playerConnection.networkManager;
PacketListenerPlayIn oldListener = (PacketListenerPlayIn) manager.getPacketListener();
manager.a(new DenizenPacketListener(entityPlayer, oldListener));
DenizenNetworkManager.setNetworkManager(event.getPlayer());
}
}
}

0 comments on commit a73d215

Please sign in to comment.