public class ProxyClient extends ProxyCommon {
public void preInit() {
FMLCommonHandler.instance().bus().register(new EventInit());
RegKey.preInit();
}
}
public class EventInit {
@SubscribeEvent
public void onKeyInputEvent(InputEvent.KeyInputEvent event) {
MovingObjectPosition mop = EntityLook.getMouseOver(mc.thePlayer, 1F, 5D, true);
if (mop == null) return;
if (mop.typeOfHit != MovingObjectPosition.MovingObjectType.ENTITY) return;
if (RegKey.use.isPressed()) {
MessageUpPickup message = new MessageUpPickup();
message.id = mop.entityHit.getEntityId();
SMTCommon.network.sendToServer(message);
}
}
}
public class EntityLook {
public static MovingObjectPosition getMouseOver(EntityLivingBase entity_base, float fasc, double dist, boolean interact) {
if (entity_base == null || entity_base.worldObj == null) return null;
Entity pointedEntity = null;
double d0 = dist;
double d1 = d0;
Vec3 vec3 = Vec3.createVectorHelper(entity_base.posX,
(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? entity_base.posY : entity_base.posY + entity_base.getEyeHeight()),
entity_base.posZ);
Vec3 vec31 = entity_base.getLook(fasc);
Vec3 vec32 = vec3.addVector(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0);
Vec3 vec33 = null;
MovingObjectPosition objectMouseOver = rayTrace(entity_base, dist, fasc);
if (objectMouseOver != null)
d1 = objectMouseOver.hitVec.distanceTo(vec3);
float f1 = 1.0F;
List list = entity_base.worldObj.getEntitiesWithinAABBExcludingEntity(entity_base, entity_base.boundingBox.addCoord(vec31.xCoord * d0, vec31.yCoord * d0, vec31.zCoord * d0).expand((double)f1, (double)f1, (double)f1));
double d2 = d1;
for (int i = 0; i < list.size(); ++i) {
Entity entity = (Entity)list.get(i);
if (entity.canBeCollidedWith() || interact) {
float f2 = entity.getCollisionBorderSize();
AxisAlignedBB axisalignedbb = entity.boundingBox.expand((double)f2, (double)f2, (double)f2);
MovingObjectPosition movingobjectposition = axisalignedbb.calculateIntercept(vec3, vec32);
if (axisalignedbb.isVecInside(vec3)) {
if (0.0D < d2 || d2 == 0.0D) {
pointedEntity = entity;
vec33 = movingobjectposition == null ? vec3 : movingobjectposition.hitVec;
d2 = 0.0D;
}
} else if (movingobjectposition != null) {
double d3 = vec3.distanceTo(movingobjectposition.hitVec);
if (d3 < d2 || d2 == 0.0D) {
if (entity == entity_base.ridingEntity && !entity.canRiderInteract()) {
if (d2 == 0.0D) {
pointedEntity = entity;
vec33 = movingobjectposition.hitVec;
}
} else {
pointedEntity = entity;
vec33 = movingobjectposition.hitVec;
d2 = d3;
}
}
}
}
}
if (pointedEntity != null && (d2 < d1 || objectMouseOver == null))
return new MovingObjectPosition(pointedEntity, vec33);
return null;
}
public static MovingObjectPosition rayTrace(EntityLivingBase entity, double dist, float fasc) {
Vec3 vec3 = Vec3.createVectorHelper(entity.posX,
(FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT ? entity.posY : entity.posY + entity.getEyeHeight()),
entity.posZ);
Vec3 vec31 = entity.getLook(fasc);
Vec3 vec32 = vec3.addVector(vec31.xCoord * dist, vec31.yCoord * dist, vec31.zCoord * dist);
return entity.worldObj.func_147447_a(vec3, vec32, false, false, true);
}
}
@SideOnly(Side.CLIENT)
public class RegKey {
private static final String CAT_NAME = "category.control_button.name";
public static final KeyBinding use = new KeyBinding("key.use.name", Keyboard.KEY_F, CAT_NAME);
public static void preInit() {
ClientRegistry.registerKeyBinding(use);
}
}
public static SimpleNetworkWrapper network;
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent event) {
MinecraftForge.EVENT_BUS.register(new EventsForge());
network = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
network.registerMessage(MessageUpPickup.Handler.class, MessageUpPickup.class, 0, Side.CLIENT);
network.registerMessage(MessageUpPickup.Handler.class, MessageUpPickup.class, 0, Side.SERVER);
proxy.preInit();
}
public class MessageUpPickup implements IMessage {
public int id;
public MessageUpPickup() {}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(id);
}
@Override
public void fromBytes(ByteBuf buf) {
id = buf.readInt();
}
public static class Handler implements IMessageHandler<MessageUpPickup, IMessage> {
@Override
public IMessage onMessage(MessageUpPickup packet, MessageContext message) {
if (message.side.isClient())
act(packet);
else
act(message.getServerHandler().playerEntity, packet);
return null;
}
@SideOnly(Side.CLIENT)
private void act(MessageUpPickup packet) {
Minecraft mc = Minecraft.getMinecraft();
if (!EventsForge.pickup.containsKey(mc.thePlayer)) {
ArrayList list = new ArrayList();
list.add(packet.id);
EventsForge.pickup.put(mc.thePlayer, list);
} else {
EventsForge.pickup.get(mc.thePlayer).add(packet.id);
}
}
private void act(EntityPlayerMP player, MessageUpPickup packet) {
if (!EventsForge.pickup.containsKey(player)) {
ArrayList list = new ArrayList();
list.add(packet.id);
EventsForge.pickup.put(player, list);
} else {
EventsForge.pickup.get(player).add(packet.id);
}
}
}
}
public class EventsForge {
public static final HashMap<EntityPlayer, ArrayList<Integer>> pickup = new HashMap<EntityPlayer, ArrayList<Integer>>();
@SubscribeEvent
public void noPuckup(EntityItemPickupEvent event) {
List<Integer> list = pickup.get(event.entityPlayer);
if (list != null) {
for (int i = 0; i < list.size(); ++i) {
int id = list.get(i);
if (id == event.item.getEntityId()) {
list.remove(i);
return;
}
}
}
event.setCanceled(true);
}
}
Не делай так. Игрок выходя с сервере не исчезнет из мапы, и будет утечка. Для таких целей нужно использовать мягкие ссылки. Например, WeakHashMap или другую коллекцию, содержащую WeakReference'ы.timaxa007 написал(а):Код:HashMap<EntityPlayer, ArrayList<Integer>>