- 1,159
- 38
- 544
Здравствуйте, у меня есть инвентарь с полем
Мой пакет:
Регистрируем пакет в CommonProxy:
Вот так я отправляю пакет на клиент из инвентаря:
Когда код выполяем - я получаю краш:
Я не до конца понимаю почему каст не может соверщиться. Может быть отсюда нельзя отправлять пакеты или я пытаюсь отправить их с клиента на клиент? Подскажите пожалуйста, что я делаю не так и чего не понимаю.
Однако я решил пойти другим путем и отправлять пакет через небольшой костыль, дабы избежать приведения типов:
Это привел к крашу, но теперь Stacktrace становится вообще нечитабельным и не информативным (в нем нет ни единой ссылки на мой код. Исключение выбрасывается где-то внутри игры). Он настолько огромен, что я не могу его запостить на форум:
stacktrace - Pastebin.com
Уважаемые форумчане, что я делаю не так?
ArrayList<ItemStack>
и мне нужно чтобы это поле синхронизировалось на клиенте и на сервере. Для этого я создал пакет, который хочу отослать пользователю, с которым нужно синхронизироваться.Мой пакет:
Java:
package rsstats.common.network;
import cpw.mods.fml.common.network.ByteBufUtils;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import rsstats.client.ClientProxy;
import java.util.ArrayList;
public class PacketUpdateParams implements IMessage {
private ArrayList<ItemStack> skills;
public PacketUpdateParams(ArrayList<ItemStack> skills) {
this.skills = skills;
}
/**
* Convert from the supplied buffer into your specific message type
*
* @param buf
*/
@Override
public void fromBytes(ByteBuf buf) {
// Читаем размер списка
int skillsSize = ByteBufUtils.readVarShort(buf);
// Восстанавливаем список из ByteBuf
skills = new ArrayList<ItemStack>(skillsSize);
for (int i = 0; i < skills.size(); i++) {
ItemStack itemStack = ItemStack.loadItemStackFromNBT(ByteBufUtils.readTag(buf));
skills.set(i, itemStack);
}
}
/**
* Deconstruct your message into the supplied byte buffer
*
* @param buf
*/
@Override
public void toBytes(ByteBuf buf) {
ByteBufUtils.writeVarShort(buf, skills.size()); // Записываем размер списка
for (ItemStack skill : skills) { // и сам список
NBTTagCompound NBTSkillItem = new NBTTagCompound();
skill.writeToNBT(NBTSkillItem);
ByteBufUtils.writeTag(buf, NBTSkillItem);
}
}
/**
* Обработчик сообщения {@link PacketOpenRSStatsInventory}
*/
public static class MessageHandler implements IMessageHandler<PacketUpdateParams, IMessage> {
@Override
public IMessage onMessage(PacketUpdateParams message, MessageContext ctx) {
ClientProxy.extendedPlayer.skillsInventory.setNewSkills(message.skills); // Устанавливаем пришедшие данные
ClientProxy.extendedPlayer.updateParams(); // И делаем update - это чисто мое и не важно
return null;
}
}
}
Регистрируем пакет в CommonProxy:
Java:
/**
* Проки, содержащий код как для клиента, так и сервера
* @author RareScrap
*/
public class CommonProxy implements IGuiHandler {
// some code
public void preInit(FMLPreInitializationEvent event) {
// some code
INSTANCE.registerMessage(PacketUpdateParams.MessageHandler.class, PacketUpdateParams.class, 4, Side.CLIENT);
// some code
}
// some code
}
Вот так я отправляю пакет на клиент из инвентаря:
Java:
// StatsInventory - реализует IInventory
public class SkillsInventory extends StatsInventory {
// some code
/** Структура, хранящая все предметы инвентаря в стаках */
private ArrayList<ItemStack> skills = new ArrayList<ItemStack>();
/** Игрок, к которому привязан инвентарь */
private EntityPlayer entityPlayer;
/**
* Необходимый публичный контсруктор
*/
public SkillsInventory(EntityPlayer entityPlayer) {
super(entityPlayer);
this.entityPlayer = entityPlayer;
}
// SomeCode
@Override
public void setInventorySlotContents(int slotIndex, ItemStack itemStack) {
// some code
CommonProxy.INSTANCE.sendTo(new PacketUpdateParams(skills), (EntityPlayerMP) entityPlayer);
// some code
}
// some code
}
Когда код выполяем - я получаю краш:
java.lang.ClassCastException: net.minecraft.client.entity.EntityClientPlayerMP cannot be cast to net.minecraft.entity.player.EntityPlayerMP
at rsstats.inventory.SkillsInventory.setInventorySlotContents(SkillsInventory.java:85)
at net.minecraft.inventory.Slot.putStack(Slot.java:104)
at net.minecraft.inventory.Container.putStacksInSlots(Container.java:558)
at net.minecraft.client.network.NetHandlerPlayClient.handleWindowItems(NetHandlerPlayClient.java:1202)
at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:70)
at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:78)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
at net.minecraft.client.multiplayer.PlayerControllerMP.updateController(PlayerControllerMP.java:317)
at net.minecraft.client.Minecraft.runTick(Minecraft.java:1693)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1039)
at net.minecraft.client.Minecraft.run(Minecraft.java:962)
at net.minecraft.client.main.Main.main(Main.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
at GradleStart.main(Unknown Source)
at rsstats.inventory.SkillsInventory.setInventorySlotContents(SkillsInventory.java:85)
at net.minecraft.inventory.Slot.putStack(Slot.java:104)
at net.minecraft.inventory.Container.putStacksInSlots(Container.java:558)
at net.minecraft.client.network.NetHandlerPlayClient.handleWindowItems(NetHandlerPlayClient.java:1202)
at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:70)
at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:78)
at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
at net.minecraft.client.multiplayer.PlayerControllerMP.updateController(PlayerControllerMP.java:317)
at net.minecraft.client.Minecraft.runTick(Minecraft.java:1693)
at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1039)
at net.minecraft.client.Minecraft.run(Minecraft.java:962)
at net.minecraft.client.main.Main.main(Main.java:164)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
at GradleStart.main(Unknown Source)
Я не до конца понимаю почему каст не может соверщиться. Может быть отсюда нельзя отправлять пакеты или я пытаюсь отправить их с клиента на клиент? Подскажите пожалуйста, что я делаю не так и чего не понимаю.
Однако я решил пойти другим путем и отправлять пакет через небольшой костыль, дабы избежать приведения типов:
Java:
// StatsInventory - реализует IInventory
public class SkillsInventory extends StatsInventory {
// some code
/** Структура, хранящая все предметы инвентаря в стаках */
private ArrayList<ItemStack> skills = new ArrayList<ItemStack>();
/** Игрок, к которому привязан инвентарь */
private EntityPlayer entityPlayer;
/**
* Необходимый публичный контсруктор
*/
public SkillsInventory(EntityPlayer entityPlayer) {
super(entityPlayer);
this.entityPlayer = entityPlayer;
}
// SomeCode
@Override
public void setInventorySlotContents(int slotIndex, ItemStack itemStack) {
// some code
// ТЕПЕРЬ ПОПРОБУЕМ ВОТ ТАК
CommonProxy.INSTANCE.sendToAllAround(new PacketUpdateParams(skills), new NetworkRegistry.TargetPoint(entityPlayer.dimension, entityPlayer.posX, entityPlayer.posY, entityPlayer.posZ, 10));
// some code
}
// some code
}
Это привел к крашу, но теперь Stacktrace становится вообще нечитабельным и не информативным (в нем нет ни единой ссылки на мой код. Исключение выбрасывается где-то внутри игры). Он настолько огромен, что я не могу его запостить на форум:
stacktrace - Pastebin.com
Уважаемые форумчане, что я делаю не так?