From 3c9b42355ff1c8019e58aa3e879120ecb2db48c5 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sun, 1 Dec 2013 18:34:23 +0800 Subject: [PATCH] Fix mob NPCs and get closer to working players (not yet though) --- .../npc/network/EmptyChannel.java | 80 +++++++++++++++++++ .../npc/network/EmptyNetworkManager.java | 9 +-- src/main/java/net/citizensnpcs/util/NMS.java | 25 +++++- 3 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 src/main/java/net/citizensnpcs/npc/network/EmptyChannel.java diff --git a/src/main/java/net/citizensnpcs/npc/network/EmptyChannel.java b/src/main/java/net/citizensnpcs/npc/network/EmptyChannel.java new file mode 100644 index 000000000..e89a267b3 --- /dev/null +++ b/src/main/java/net/citizensnpcs/npc/network/EmptyChannel.java @@ -0,0 +1,80 @@ +package net.citizensnpcs.npc.network; + +import java.net.SocketAddress; + +import net.minecraft.util.io.netty.channel.AbstractChannel; +import net.minecraft.util.io.netty.channel.Channel; +import net.minecraft.util.io.netty.channel.ChannelConfig; +import net.minecraft.util.io.netty.channel.ChannelMetadata; +import net.minecraft.util.io.netty.channel.ChannelOutboundBuffer; +import net.minecraft.util.io.netty.channel.DefaultChannelConfig; +import net.minecraft.util.io.netty.channel.EventLoop; + +public class EmptyChannel extends AbstractChannel { + private final ChannelConfig config = new DefaultChannelConfig(this); + + public EmptyChannel(Channel parent) { + super(parent); + } + + @Override + public ChannelConfig config() { + config.setAutoRead(true); + return config; + } + + @Override + protected void doBeginRead() throws Exception { + } + + @Override + protected void doBind(SocketAddress arg0) throws Exception { + } + + @Override + protected void doClose() throws Exception { + } + + @Override + protected void doDisconnect() throws Exception { + } + + @Override + protected void doWrite(ChannelOutboundBuffer arg0) throws Exception { + } + + @Override + public boolean isActive() { + return false; + } + + @Override + protected boolean isCompatible(EventLoop arg0) { + return true; + } + + @Override + public boolean isOpen() { + return false; + } + + @Override + protected SocketAddress localAddress0() { + return null; + } + + @Override + public ChannelMetadata metadata() { + return null; + } + + @Override + protected AbstractUnsafe newUnsafe() { + return null; + } + + @Override + protected SocketAddress remoteAddress0() { + return null; + } +} diff --git a/src/main/java/net/citizensnpcs/npc/network/EmptyNetworkManager.java b/src/main/java/net/citizensnpcs/npc/network/EmptyNetworkManager.java index 0d787b79e..a2e38e314 100644 --- a/src/main/java/net/citizensnpcs/npc/network/EmptyNetworkManager.java +++ b/src/main/java/net/citizensnpcs/npc/network/EmptyNetworkManager.java @@ -2,17 +2,12 @@ package net.citizensnpcs.npc.network; import java.io.IOException; +import net.citizensnpcs.util.NMS; import net.minecraft.server.v1_7_R1.NetworkManager; -import net.minecraft.util.io.netty.channel.ChannelHandlerContext; public class EmptyNetworkManager extends NetworkManager { public EmptyNetworkManager(boolean flag) throws IOException { super(flag); - } - - @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - super.channelActive(ctx); - ctx.channel().close(); + NMS.initNetworkManager(this); } } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/util/NMS.java b/src/main/java/net/citizensnpcs/util/NMS.java index b1ecbd3c2..669a9453a 100644 --- a/src/main/java/net/citizensnpcs/util/NMS.java +++ b/src/main/java/net/citizensnpcs/util/NMS.java @@ -2,6 +2,7 @@ package net.citizensnpcs.util; import java.lang.reflect.Constructor; import java.lang.reflect.Field; +import java.net.SocketAddress; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -12,6 +13,7 @@ import java.util.WeakHashMap; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.npc.entity.EntityHumanNPC; +import net.citizensnpcs.npc.network.EmptyChannel; import net.minecraft.server.v1_7_R1.AttributeInstance; import net.minecraft.server.v1_7_R1.ControllerJump; import net.minecraft.server.v1_7_R1.DamageSource; @@ -27,6 +29,7 @@ import net.minecraft.server.v1_7_R1.GenericAttributes; import net.minecraft.server.v1_7_R1.MathHelper; import net.minecraft.server.v1_7_R1.MobEffectList; import net.minecraft.server.v1_7_R1.Navigation; +import net.minecraft.server.v1_7_R1.NetworkManager; import net.minecraft.server.v1_7_R1.Packet; import net.minecraft.server.v1_7_R1.PathfinderGoalSelector; import net.minecraft.server.v1_7_R1.World; @@ -218,6 +221,21 @@ public class NMS { return DEFAULT_SPEED; } + public static void initNetworkManager(NetworkManager network) { + if (NETWORK_CHANNEL == null || NETWORK_ADDRESS == null) + return; + try { + NETWORK_CHANNEL.set(network, new EmptyChannel(null)); + NETWORK_ADDRESS.set(network, new SocketAddress() { + private static final long serialVersionUID = 8207338859896320185L; + }); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + public static boolean inWater(org.bukkit.entity.Entity entity) { Entity mcEntity = getHandle(entity); return mcEntity.M() || mcEntity.P(); @@ -484,16 +502,19 @@ public class NMS { private static Map, Integer> MC_ENTITY_CLASS_TO_INT = null; private static Map> MC_ENTITY_INT_TO_CLASS = null; private static Field NAVIGATION_WORLD_FIELD = getField(Navigation.class, "b"); + private static Field NETWORK_ADDRESS = getField(NetworkManager.class, "l"); + private static Field NETWORK_CHANNEL = getField(NetworkManager.class, "k"); private static final Location PACKET_CACHE_LOCATION = new Location(null, 0, 0, 0); private static Field PATHFINDING_RANGE = getField(Navigation.class, "e"); + private static final Random RANDOM = Util.getFastRandom(); // true field above false and three synchronised lists static { try { - Field field = getField(EntityTypes.class, "d"); + Field field = getField(EntityTypes.class, "e"); ENTITY_INT_TO_CLASS = (Map>) field.get(null); - field = getField(EntityTypes.class, "e"); + field = getField(EntityTypes.class, "f"); ENTITY_CLASS_TO_INT = (Map, Integer>) field.get(null); } catch (Exception e) { Messaging.logTr(Messages.ERROR_GETTING_ID_MAPPING, e.getMessage());