Вопросы

То бишь почти тоде самое, что и у меня, только а не протупил и не начал изобретать велосипед(ибо есть 1 - FMLIndexedMessageToMessageCodec, который сам за тебя делает большую часть ихнего MessageToMessageCodec-а, и 2 - есть SimpleChannelInboundHandler от самой Netty, делающий вторую часть).

Код:
trait Packet{

  def write(buf: ByteBuf)

  def read(buf: ByteBuf)

  def execute(side: Side)
}

Код:
object PacketCodec extends FMLIndexedMessageToMessageCodec[Packet]{

  override def encodeInto(ctx: ChannelHandlerContext, packet: Packet, buf: ByteBuf) =
    packet.write(buf)

  override def decodeInto(ctx: ChannelHandlerContext, buf: ByteBuf, packet: Packet) =
    packet.read(buf)
}

Код:
class PacketHandler(side: Side) extends SimpleChannelInboundHandler[Packet]{

  override def channelRead0(ctx: ChannelHandlerContext, packet: Packet) =
    packet.execute(side)
}

Код:
import cpw.mods.fml.common.network.FMLOutboundHandler.OutboundTarget._
import net.minecraft.network.{Packet => MCPacket}

object PacketManager{
 {
   registerPacket(classOf[PacketUpdateTile], 0)
   registerPacket(classOf[PacketUpdateInventory], 1)
 }

  private val target = FMLOutboundHandler.FML_MESSAGETARGET
  private val args = FMLOutboundHandler.FML_MESSAGETARGETARGS
  private val fireExc = ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE

  var client: FMLEmbeddedChannel = null
  var server: FMLEmbeddedChannel = null

  def registerPacket(cls: Class[_ <: Packet], id: Int) =
    PacketCodec.addDiscriminator(id, cls)

  def init() = {
    val channels = NetworkRegistry.INSTANCE.newChannel("rcircuits_channel", PacketCodec)
    client = channels.get(Side.CLIENT)
    server = channels.get(Side.SERVER)
    val tpe = classOf[FMLIndexedMessageToMessageCodec[Packet]]
    client.pipeline().addAfter(client.findChannelHandlerNameForType(tpe), "executor", new PacketHandler(Side.CLIENT))
    server.pipeline().addAfter(server.findChannelHandlerNameForType(tpe), "executor", new PacketHandler(Side.SERVER))
  }

  def getPacketFrom(packet: Packet): MCPacket =
    server.generatePacketFrom(packet)

  def sendToServer(packet: Packet) = {
    client.attr(target).set(TOSERVER)
    client.writeAndFlush(packet).addListener(fireExc)
  }

  def sendToAll(packet: Packet) = {
    server.attr(target).set(ALL)
    server.writeAndFlush(packet).addListener(fireExc)
  }

  def sendTo(packet: Packet, player: EntityPlayerMP) = {
    server.attr(target).set(PLAYER)
    server.attr(args).set(player)
    server.writeAndFlush(packet).addListener(fireExc)
  }

  def sendToAllAround(packet: Packet, x: Double, y: Double, z: Double, range: Double, dim: Int) = {
    server.attr(target).set(ALLAROUNDPOINT)
    server.attr(args).set(new NetworkRegistry.TargetPoint(dim, x, y, z, range))
    server.writeAndFlush(packet).addListener(fireExc)
  }

  def sendToDimension(packet: Packet, dimensionId: Int) = {
    server.attr(target).set(DIMENSION)
    server.attr(args).set(Int.box(dimensionId))
    server.writeAndFlush(packet).addListener(fireExc)
  }
}

А зайти в BuildCraft и узреть, чего там SpaceToad вытворяет с аннотациями(особенно после того. как я открыл его глаза на .setAccessible(true)) - вообще забавно получится(хотя и кода побольше там будет).
 
Oldestkon написал(а):
Объяснил бы лучше, всяко полезнее капсопредложений будет.

Так бы и сказали, что другое надо. Я на фордж вообще не пишу и про версию не видел.
http://www.minecraftforge.net/wiki/Netty_Packet_Handling
http://www.minecraftforge.net/forum/index.php?topic=15403.0
Покопался, нашел.

Пример пакета:

Код:
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.entity.player.EntityPlayer;

public class PacketSync extends AbstractPacket
{
   boolean toggle;
   boolean digUnderToggle;

   public PacketSync() {
   }

   public PacketSync(boolean ver1, boolean ver2) {
      toggle = ver1;
      digUnderToggle = ver2;
   }

   @Override
   public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
      buffer.writeBoolean(toggle);
      buffer.writeBoolean(digUnderToggle);
   }

   @Override
   public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
      toggle = buffer.readBoolean();
      digUnderToggle = buffer.readBoolean();

   }

   @Override
   public void handleClientSide(EntityPlayer player) {
   }

   @Override
   public void handleServerSide(EntityPlayer player) {
      System.out.println(toggle);
      System.out.println(digUnderToggle);
   }
}


Регистрация:

Объявляешь где-нибудь в классе мода:

Код:
public static final PacketPipeline packetPipeline = new PacketPipeline();

Код:
@EventHandler
public void initialise(FMLInitializationEvent evt) {
    packetPipeline.initialise();
    packetPipeline.registerPacket(PacketSync.class);
}
Код:
@EventHandler
public void postInitialise(FMLPostInitializationEvent evt) {
    packetPipeline.postInitialise();
}

Отправка:
Код:
packetPipeline.sendToServer(new PacketSync(true, false));

Отправлять можно откуда угодно, опять же:

Код:
ModClass.packetPipeline.sendTo***(Player/Server)(new MyPacket(args));

Пример из КИТАЙСКОГО ГРЕБАНОГО САЙТА.
Тебе осталось только вытаскивать игрока на сервере и найти метод в packetPipeline, который отсылает пакет с сервера игроку. Ну ещё определять сторону через
Код:
FMLCommonHandler.instance().getEffectiveSide();

P.S. Ни сурсов, ни форджа, ничего, где можно протестить, под рукой нет. Правил все на коленках, могут быть где-то незначительные косяки.
Достав из ссылки АБстракт пакет и пайплайн, (копипастик)взяв этот код. Ошибок нет. В пайплане есть метод SendTo. Там один из аргументов - Игрок(вроде мультиплэйерный). Так и не понятно что сувать в первый, он просит абстракт пакет. :/. Вот поэтому не люблю серверную часть.:(
P.S. До меня это очень долго доходит.
 
Свой пакет и суй, что за глупые вопросы?
 
laz2727 написал(а):
Свой пакет и суй, что за глупые вопросы?
Криворукая, всё я въехала что сувать
P.S. Так серверный игрок...Так а его откуда вырывать?
 
Ну блин, посылай в своем пакете тот же ник игрока, и доставай его через ник.
 
А нет скопипастить у меня(чуть переделав под Java) и не париться?
 
anti344 написал(а):
А нет скопипастить у меня(чуть переделав под Java) и не париться?
Ты говорил,что у скалы по-другому,вроде как в яве чё-то есть,что уменьшает код. (Или до меня не так дошло?)
Dragon2488 написал(а):
Ну блин, посылай в своем пакете тот же ник игрока, и доставай его через ник.
(О боже почему до меня так долго доходит)Ник откуда достать?
 
Ну, переписать никто не мешает, никаких особых, уличных фич, невозможных в жабе, там нет.
 
laz2727 написал(а):
Ну, переписать никто не мешает, никаких особых, уличных фич, невозможных в жабе, там нет.
Если проблем не возникнет перепишу. Я же из-за неуверености не тронула
 
А ник игрока - entityPlayer.getGameProfile().getName()
 
Skarlet написал(а):
Ты говорил,что у скалы по-другому,вроде как в яве чё-то есть,что уменьшает код. (Или до меня не так дошло?)
Гм.., скорее в скале что-то есть, что уменьшает код. Так же необязательность скобок при однострочных методах.
 
Проблемка с переводом на яву. Конструкции не очень понятны.
Код:
object PacketManager{
 {
   registerPacket(classOf[PacketUpdateTile], 0)//Тут
   registerPacket(classOf[PacketUpdateInventory], 1)//Тут
 }

  private val target = FMLOutboundHandler.FML_MESSAGETARGET //Тут вроде всё поняла
  private val args = FMLOutboundHandler.FML_MESSAGETARGETARGS
  private val fireExc = ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE

  var client: FMLEmbeddedChannel = null//тут не очень ясно
  var server: FMLEmbeddedChannel = null

  def registerPacket(cls: Class[_ <: Packet]//эм,что это?//, id: Int) =
    PacketCodec.addDiscriminator(id, cls)
 P.S. спасибо,что подсказываете даже в чём-то элементарном. Чуть чуть и победим эти пакеты!:rolleyes:
 
Пффф...

 public class Packetmanager {
    
      public PacketManager() {
      registerPacket(PacketUpdateTile.class, 0)
      registerPacket(PacketUpdateInventory.class, 1)
     }
        FMLEmbeddetChannel client = null;
        FMLEmbeddetChannel server = null;

  public void registerPacket(Class<? extends Packet> class, int id) {
    PacketCodec.addDiscriminator(class, id);
  }
 
Я писал по памяти, может неправильно. Поищи похожий метод.
 
Dragon2488 написал(а):
Я писал по памяти, может неправильно. Поищи похожий метод.
Он в родительском есть. Но пакет(если тот пакет) не кушает
 
Dragon2488 написал(а):
предлагает создать функцию, или поменять пакет(в случае подмены снова ошибка)
 
Назад
Сверху